diff --git a/AST/ASTContext.cpp b/AST/ASTContext.cpp
index 322f34c..4351b89 100644
--- a/AST/ASTContext.cpp
+++ b/AST/ASTContext.cpp
@@ -687,7 +687,7 @@
 QualType ASTContext::getObjcInterfaceType(ObjcInterfaceDecl *Decl) {
   if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
   
-  Decl->TypeForDecl = new ObjcInterfaceType(Decl);
+  Decl->TypeForDecl = new ObjcInterfaceType(Type::ObjcInterface, Decl);
   Types.push_back(Decl->TypeForDecl);
   return QualType(Decl->TypeForDecl, 0);
 }
@@ -697,11 +697,8 @@
 /// the conforming protocol list.
 QualType ASTContext::getObjcQualifiedInterfaceType(ObjcInterfaceDecl *Decl,
                        ObjcProtocolDecl **Protocols, unsigned NumProtocols) {
-  ObjcInterfaceType *IType = 
-    cast<ObjcInterfaceType>(getObjcInterfaceType(Decl));
-  
   llvm::FoldingSetNodeID ID;
-  ObjcQualifiedInterfaceType::Profile(ID, IType, Protocols, NumProtocols);
+  ObjcQualifiedInterfaceType::Profile(ID, Protocols, NumProtocols);
   
   void *InsertPos = 0;
   if (ObjcQualifiedInterfaceType *QT =
@@ -710,7 +707,7 @@
   
   // No Match;
   ObjcQualifiedInterfaceType *QType =
-    new ObjcQualifiedInterfaceType(IType, Protocols, NumProtocols);
+    new ObjcQualifiedInterfaceType(Decl, Protocols, NumProtocols);
   Types.push_back(QType);
   ObjcQualifiedInterfaceTypes.InsertNode(QType, InsertPos);
   return QualType(QType, 0);
@@ -1204,8 +1201,8 @@
   ObjcQualifiedInterfaceType *rhsQI = 
     dyn_cast<ObjcQualifiedInterfaceType>(rhs.getCanonicalType().getTypePtr());
   assert(rhsQI && "QualifiedInterfaceTypesAreCompatible - bad rhs type");
-  if (!interfaceTypesAreCompatible(QualType(lhsQI->getInterfaceType(), 0), 
-			           QualType(rhsQI->getInterfaceType(), 0)))
+  if (!interfaceTypesAreCompatible(getObjcInterfaceType(lhsQI->getDecl()), 
+                                   getObjcInterfaceType(rhsQI->getDecl())))
     return false;
   /* All protocols in lhs must have a presense in rhs. */
   for (unsigned i =0; i < lhsQI->getNumProtocols(); i++) {
diff --git a/AST/Type.cpp b/AST/Type.cpp
index 4befdcb..b1da04b 100644
--- a/AST/Type.cpp
+++ b/AST/Type.cpp
@@ -529,16 +529,14 @@
 }
 
 void ObjcQualifiedInterfaceType::Profile(llvm::FoldingSetNodeID &ID,
-                                         ObjcInterfaceType *interfaceType, 
                                          ObjcProtocolDecl **protocols, 
                                          unsigned NumProtocols) {
-  ID.AddPointer(interfaceType);
   for (unsigned i = 0; i != NumProtocols; i++)
     ID.AddPointer(protocols[i]);
 }
 
 void ObjcQualifiedInterfaceType::Profile(llvm::FoldingSetNodeID &ID) {
-  Profile(ID, getInterfaceType(), &Protocols[0], getNumProtocols());
+  Profile(ID, &Protocols[0], getNumProtocols());
 }
 
 /// LookThroughTypedefs - Return the ultimate type this typedef corresponds to
@@ -770,7 +768,7 @@
                                   std::string &InnerString) const {
   if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
     InnerString = ' ' + InnerString;
-  std::string ObjcQIString = getInterfaceType()->getDecl()->getName();
+  std::string ObjcQIString = getDecl()->getName();
   ObjcQIString += '<';
   int num = getNumProtocols();
   for (int i = 0; i < num; i++) {
diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp
index b48703d..1d8b883 100644
--- a/Sema/SemaExpr.cpp
+++ b/Sema/SemaExpr.cpp
@@ -540,8 +540,7 @@
     if (isa<ObjcInterfaceType>(BaseType.getCanonicalType()))
       IFace = dyn_cast<ObjcInterfaceType>(BaseType)->getDecl();
     else
-      IFace = dyn_cast<ObjcQualifiedInterfaceType>(BaseType)
-                ->getInterfaceType()->getDecl();
+      IFace = dyn_cast<ObjcQualifiedInterfaceType>(BaseType)->getDecl();
     ObjcInterfaceDecl *clsDeclared;
     if (ObjcIvarDecl *IV = IFace->lookupInstanceVariable(&Member, clsDeclared))
       return new ObjCIvarRefExpr(IV, IV->getType(), MemberLoc, BaseExpr, 
@@ -2300,9 +2299,7 @@
     ObjcInterfaceDecl* ClassDecl;
     if (ObjcQualifiedInterfaceType *QIT = 
         dyn_cast<ObjcQualifiedInterfaceType>(receiverType)) {
-      ObjcInterfaceType * OITypePtr = QIT->getInterfaceType();
-      
-      ClassDecl = OITypePtr->getDecl();
+      ClassDecl = QIT->getDecl();
       Method = ClassDecl->lookupInstanceMethod(Sel);
       if (!Method) {
         // search protocols
diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h
index d6dc5f7..da44891 100644
--- a/include/clang/AST/Type.h
+++ b/include/clang/AST/Type.h
@@ -899,9 +899,9 @@
 
 class ObjcInterfaceType : public Type {
   ObjcInterfaceDecl *Decl;
-  
-  ObjcInterfaceType(ObjcInterfaceDecl *D) : 
-    Type(ObjcInterface, QualType()), Decl(D) { }
+protected:
+  ObjcInterfaceType(TypeClass tc, ObjcInterfaceDecl *D) : 
+    Type(tc, QualType()), Decl(D) { }
   friend class ASTContext;  // ASTContext creates these.
 public:
   
@@ -919,23 +919,20 @@
 /// conforming to a list of protocols; such as, INTF<Proto1, Proto2, Proto1>.
 /// Duplicate protocols are removed and protocol list is canonicalized to be in
 /// alphabetical order.
-class ObjcQualifiedInterfaceType : public Type, public llvm::FoldingSetNode {
-  // Interface type for this protocol conforming object type
-  ObjcInterfaceType *InterfaceType;
-
+class ObjcQualifiedInterfaceType : public ObjcInterfaceType, 
+                                   public llvm::FoldingSetNode {
+                                     
   // List of protocols for this protocol conforming object type
   // List is sorted on protocol name. No protocol is enterred more than once.
   llvm::SmallVector<ObjcProtocolDecl*, 8> Protocols;
 
-  ObjcQualifiedInterfaceType(ObjcInterfaceType *T,
+  ObjcQualifiedInterfaceType(ObjcInterfaceDecl *D,
                              ObjcProtocolDecl **Protos,  unsigned NumP) : 
-    Type(ObjcQualifiedInterface, QualType()), InterfaceType(T),
+    ObjcInterfaceType(ObjcQualifiedInterface, D), 
     Protocols(Protos, Protos+NumP) { }
   friend class ASTContext;  // ASTContext creates these.
 public:
   
-  ObjcInterfaceType *getInterfaceType() const { return InterfaceType; }
-  
   ObjcProtocolDecl *getProtocols(unsigned i) const {
     return Protocols[i];
   }
@@ -947,7 +944,6 @@
   
   void Profile(llvm::FoldingSetNodeID &ID);
   static void Profile(llvm::FoldingSetNodeID &ID, 
-                      ObjcInterfaceType *interfaceType, 
                       ObjcProtocolDecl **protocols, unsigned NumProtocols);
  
   static bool classof(const Type *T) { 
