diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp
index bd6e97c781bee13c72906ab49c1022f3360bdfb6..2b2f9224e997fee00c5e4ca9bd6707294c4054c3 100644
--- a/lib/ARCMigrate/ObjCMT.cpp
+++ b/lib/ARCMigrate/ObjCMT.cpp
@@ -556,11 +556,16 @@ void ObjCMigrateASTConsumer::migrateMethodInstanceType(ASTContext &Ctx,
     Selector::getInstTypeMethodFamily(OM->getSelector());
   if (OIT_Family == OIT_None)
     return;
-  // TODO. Many more to come
+  std::string ClassName;
   switch (OIT_Family) {
     case OIT_Array:
+      ClassName = "NSArray";
       break;
     case OIT_Dictionary:
+      ClassName = "NSDictionary";
+      break;
+    case OIT_MemManage:
+      ClassName = "NSObject";
       break;
     default:
       return;
@@ -575,14 +580,8 @@ void ObjCMigrateASTConsumer::migrateMethodInstanceType(ASTContext &Ctx,
     else if (ObjCImplDecl *ImpDecl = dyn_cast<ObjCImplDecl>(CDecl))
       IDecl = ImpDecl->getClassInterface();
   }
-  if (!IDecl)
-    return;
-  
-  if (OIT_Family ==  OIT_Array &&
-      !IDecl->lookupInheritedClass(&Ctx.Idents.get("NSArray")))
-    return;
-  else if (OIT_Family == OIT_Dictionary &&
-           !IDecl->lookupInheritedClass(&Ctx.Idents.get("NSDictionary")))
+  if (!IDecl ||
+      !IDecl->lookupInheritedClass(&Ctx.Idents.get(ClassName)))
     return;
   
   SourceRange R;
diff --git a/lib/Basic/IdentifierTable.cpp b/lib/Basic/IdentifierTable.cpp
index fa021f0501e6226a86bea04f9d1a746d30bc24b0..96d9e56b6c3a2b2267dd7ce3dd620f74cc60d1a1 100644
--- a/lib/Basic/IdentifierTable.cpp
+++ b/lib/Basic/IdentifierTable.cpp
@@ -471,6 +471,9 @@ ObjCInstanceTypeFamily Selector::getInstTypeMethodFamily(Selector sel) {
     case 'i':
       if (startsWithWord(name, "init")) return OIT_MemManage;
       break;
+    case 'r':
+      if (startsWithWord(name, "retain")) return OIT_MemManage;
+      break;
     case 's':
       if (startsWithWord(name, "string")) return OIT_NSString;
       else
diff --git a/test/ARCMT/objcmt-instancetype.m.result b/test/ARCMT/objcmt-instancetype.m.result
index af06e67e2adff995ce9ca18d0307a43bebd71888..7bc554faed00d9a5624b9d3fa716f1b4e1109f9a 100644
--- a/test/ARCMT/objcmt-instancetype.m.result
+++ b/test/ARCMT/objcmt-instancetype.m.result
@@ -7,12 +7,12 @@ typedef signed char BOOL;
 #define nil ((void*) 0)
 
 @interface NSObject
-+ (id)alloc;
++ (instancetype)alloc;
 @end
 
 @interface NSString : NSObject
 + (id)stringWithString:(NSString *)string;
-- (id)initWithString:(NSString *)aString;
+- (instancetype)initWithString:(NSString *)aString;
 @end
 
 @interface NSArray : NSObject
@@ -27,9 +27,9 @@ typedef signed char BOOL;
 + (instancetype)arrayWithObjects:(id)firstObj, ...;
 + (instancetype) arrayWithArray:(NSArray *)array;
 
-- (id)initWithObjects:(const id [])objects count:(unsigned long)cnt;
-- (id)initWithObjects:(id)firstObj, ...;
-- (id)initWithArray:(NSArray *)array;
+- (instancetype)initWithObjects:(const id [])objects count:(unsigned long)cnt;
+- (instancetype)initWithObjects:(id)firstObj, ...;
+- (instancetype)initWithArray:(NSArray *)array;
 
 - (id)objectAtIndex:(unsigned long)index;
 @end
@@ -51,10 +51,10 @@ typedef signed char BOOL;
 + (instancetype)dictionaryWithDictionary:(NSDictionary *)dict;
 + (instancetype)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;
 
-- (id)initWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt;
-- (id)initWithObjectsAndKeys:(id)firstObject, ...;
-- (id)initWithDictionary:(NSDictionary *)otherDictionary;
-- (id)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;
+- (instancetype)initWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt;
+- (instancetype)initWithObjectsAndKeys:(id)firstObject, ...;
+- (instancetype)initWithDictionary:(NSDictionary *)otherDictionary;
+- (instancetype)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;
 
 - (id)objectForKey:(id)aKey;
 @end