diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp
index e82ace4a8835c3f6d0cd47b028e03367daae2825..b0fb630c877f9bb76911eae3a75956b2b5cd745e 100644
--- a/src/libs/qmljs/qmljsinterpreter.cpp
+++ b/src/libs/qmljs/qmljsinterpreter.cpp
@@ -161,9 +161,15 @@ QmlObjectValue::QmlObjectValue(FakeMetaObject::ConstPtr metaObject, const QStrin
       _attachedType(0),
       _metaObject(metaObject),
       _packageName(packageName),
-      _componentVersion(version)
+      _componentVersion(version),
+      _enums()
 {
     setClassName(className);
+    int nEnums = metaObject->enumeratorCount();
+    for (int i = 0; i < nEnums; ++i) {
+        FakeMetaEnum fEnum = metaObject->enumerator(i);
+        _enums[fEnum.name()] = new QmlEnumValue(fEnum, valueOwner);
+    }
 }
 
 QmlObjectValue::~QmlObjectValue()
@@ -307,9 +313,7 @@ const Value *QmlObjectValue::propertyValue(const FakeMetaProperty &prop) const
         typeName = components.last();
     }
     if (base) {
-        const FakeMetaEnum &metaEnum = base->getEnum(typeName);
-        if (metaEnum.isValid())
-            value = new QmlEnumValue(metaEnum, valueOwner());
+        value = base->getEnumValue(typeName);
     }
 
     return value;
@@ -378,6 +382,11 @@ FakeMetaEnum QmlObjectValue::getEnum(const QString &typeName) const
     return _metaObject->enumerator(index);
 }
 
+const QmlEnumValue *QmlObjectValue::getEnumValue(const QString &typeName) const
+{
+    return _enums.value(typeName, 0);
+}
+
 bool QmlObjectValue::isWritable(const QString &propertyName) const
 {
     for (const QmlObjectValue *it = this; it; it = it->prototype()) {
diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h
index c4e0d0d1de7ff8585b05aadc6c6a831fe73a0069..85a49a5ee6aa2ca551ac9e2d8a21d03191f94171 100644
--- a/src/libs/qmljs/qmljsinterpreter.h
+++ b/src/libs/qmljs/qmljsinterpreter.h
@@ -421,6 +421,20 @@ private:
     Error m_error;
 };
 
+class QMLJS_EXPORT QmlEnumValue: public NumberValue
+{
+public:
+    QmlEnumValue(const LanguageUtils::FakeMetaEnum &metaEnum, ValueOwner *valueOwner);
+    virtual ~QmlEnumValue();
+
+    QString name() const;
+    QStringList keys() const;
+
+private:
+    LanguageUtils::FakeMetaEnum *_metaEnum;
+};
+
+
 // A ObjectValue based on a FakeMetaObject.
 // May only have other QmlObjectValues as ancestors.
 class QMLJS_EXPORT QmlObjectValue: public ObjectValue
@@ -455,6 +469,7 @@ public:
     bool hasChildInPackage() const;
 
     LanguageUtils::FakeMetaEnum getEnum(const QString &typeName) const;
+    const QmlEnumValue *getEnumValue(const QString &typeName) const;
 protected:
     const Value *findOrCreateSignature(int index, const LanguageUtils::FakeMetaMethod &method,
                                        QString *methodName) const;
@@ -466,19 +481,7 @@ private:
     const QString _packageName;
     const LanguageUtils::ComponentVersion _componentVersion;
     mutable QHash<int, const Value *> _metaSignature;
-};
-
-class QMLJS_EXPORT QmlEnumValue: public NumberValue
-{
-public:
-    QmlEnumValue(const LanguageUtils::FakeMetaEnum &metaEnum, ValueOwner *valueOwner);
-    virtual ~QmlEnumValue();
-
-    QString name() const;
-    QStringList keys() const;
-
-private:
-    LanguageUtils::FakeMetaEnum *_metaEnum;
+    QHash<QString, const QmlEnumValue * > _enums;
 };
 
 class QMLJS_EXPORT Activation