diff --git a/src/main/java/com/android/tools/r8/ir/optimize/MethodPoolCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/MethodPoolCollection.java
index 68b32ea..387a12b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/MethodPoolCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/MethodPoolCollection.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.utils.MethodSignatureEquivalence;
 
 // Per-class collection of method signatures.
@@ -48,17 +49,15 @@
         }
       }
       if (clazz.isInterface()) {
-        clazz.type.forAllImplementsSubtypes(
-            implementer -> {
-              DexClass subClazz = application.definitionFor(implementer);
-              if (subClazz != null) {
-                MemberPool<DexMethod> childPool =
-                    memberPools.computeIfAbsent(subClazz, k -> new MemberPool<>(equivalence));
-                childPool.linkInterface(methodPool);
-              }
-            });
+        for (DexType subtype : clazz.type.allImmediateSubtypes()) {
+          DexClass subClazz = application.definitionFor(subtype);
+          if (subClazz != null) {
+            MemberPool<DexMethod> childPool =
+                memberPools.computeIfAbsent(subClazz, k -> new MemberPool<>(equivalence));
+            childPool.linkInterface(methodPool);
+          }
+        }
       }
     };
   }
-
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/NestedInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/NestedInterfaceMethodTest.java
index 7454509..a1e2578 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/NestedInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/NestedInterfaceMethodTest.java
@@ -4,7 +4,8 @@
 
 package com.android.tools.r8.ir.optimize.uninstantiatedtypes;
 
-import static org.hamcrest.CoreMatchers.containsString;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.NeverMerge;
@@ -13,6 +14,8 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -41,16 +44,18 @@
       testForJvm().addTestClasspath().run(TestClass.class).assertSuccessWithOutput(expectedOutput);
     }
 
-    testForR8(parameters.getBackend())
-        .addInnerClasses(NestedInterfaceMethodTest.class)
-        .addKeepMainRule(TestClass.class)
-        .enableInliningAnnotations()
-        .enableMergeAnnotations()
-        .setMinApi(AndroidApiLevel.B)
-        .run(parameters.getRuntime(), TestClass.class)
-        .assertFailureWithErrorThatMatches(containsString("AbstractMethodError"));
+    CodeInspector inspector =
+        testForR8(parameters.getBackend())
+            .addInnerClasses(NestedInterfaceMethodTest.class)
+            .addKeepMainRule(TestClass.class)
+            .enableInliningAnnotations()
+            .enableMergeAnnotations()
+            .addOptionsModification(options -> options.enableDevirtualization = false)
+            .setMinApi(AndroidApiLevel.B)
+            .run(parameters.getRuntime(), TestClass.class)
+            .assertSuccessWithOutput(expectedOutput)
+            .inspector();
 
-    /*
     ClassSubject interfaceSubject = inspector.clazz(I.class);
     assertThat(interfaceSubject, isPresent());
     assertThat(interfaceSubject.method(Uninstantiated.class.getTypeName(), "m"), isPresent());
@@ -58,7 +63,6 @@
     ClassSubject classSubject = inspector.clazz(A.class);
     assertThat(classSubject, isPresent());
     assertThat(classSubject.method(Uninstantiated.class.getTypeName(), "m"), isPresent());
-    */
   }
 
   static class TestClass {
