Use [prop_search()](http://www.blender.org/documentation/blender_python_api_2_70_release/bpy.types.UILayout.html#bpy.types.UILayout.prop_search), a `StringProperty` and a `CollectionProperty`.

    import bpy

    enum_items = (
        ('FOO', 'Foo', ''),
        ('BAR', 'Bar', '')
    )
    
    class HelloWorldPanel(bpy.types.Panel):
        """Creates a Panel in the Object properties window"""
        bl_label = "Hello World Panel"
        bl_idname = "OBJECT_PT_hello"
        bl_space_type = 'PROPERTIES'
        bl_region_type = 'WINDOW'
        bl_context = "object"
    
        def draw(self, context):
            layout = self.layout
    
            obj = context.object
    
            col = layout.column()        
            col.prop_search(context.scene, "coll_string", context.scene, "coll", icon='OBJECT_DATA')
    
    def populate_coll(scene):
        bpy.app.handlers.scene_update_pre.remove(populate_coll)
        scene.coll.clear()
        for identifier, name, description in enum_items:
            scene.coll.add().name = name
    
    def register():
        bpy.utils.register_module(__name__)
        
        bpy.types.Scene.coll = bpy.props.CollectionProperty(
            type=bpy.types.PropertyGroup
        )
        
        bpy.types.Scene.coll_string = bpy.props.StringProperty()
        
        # Hack for testing
        bpy.app.handlers.scene_update_pre.append(populate_coll)
    
    
    def unregister():
        bpy.utils.unregister_module(__name__)
        del bpy.types.Scene.coll
        del bpy.types.Scene.coll_string
    
    
    if __name__ == "__main__":
        register()

For limitations please read:<br>
[Is it possible to use bpy.props.PointerProperty to store a pointer to an object?](http://blender.stackexchange.com/questions/6975/is-it-possible-to-use-bpy-props-pointerproperty-to-store-a-pointer-to-an-object)