diff --git a/src/test/java/com/android/tools/r8/partial/ClassHierarchyInterleavedD8AndR8Test.java b/src/test/java/com/android/tools/r8/partial/ClassHierarchyInterleavedD8AndR8Test.java
index db45859..a44f2bb 100644
--- a/src/test/java/com/android/tools/r8/partial/ClassHierarchyInterleavedD8AndR8Test.java
+++ b/src/test/java/com/android/tools/r8/partial/ClassHierarchyInterleavedD8AndR8Test.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.partial;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -40,7 +41,9 @@
   }
 
   private void runTest(
-      Predicate<String> isR8, ThrowingConsumer<CodeInspector, RuntimeException> inspector)
+      Predicate<String> isR8,
+      ThrowingConsumer<CodeInspector, RuntimeException> d8Inspector,
+      ThrowingConsumer<CodeInspector, RuntimeException> inspector)
       throws Exception {
     // Path tempDir = temp.newFolder().toPath();
     testForR8Partial(parameters.getBackend())
@@ -49,6 +52,7 @@
         .addKeepMainRule(Main.class)
         .setR8PartialConfigurationPredicate(isR8)
         .compile()
+        .inspectD8Input(d8Inspector)
         .inspect(inspector)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithEmptyOutput();
@@ -59,6 +63,11 @@
     runTest(
         name -> !name.equals(A.class.getTypeName()),
         inspector -> {
+          assertThat(inspector.programClass(A.class), isPresent());
+          assertThat(inspector.programClass(B.class), isAbsent());
+          assertThat(inspector.programClass(C.class), isAbsent());
+        },
+        inspector -> {
           assertThat(inspector.clazz(A.class), isPresentAndNotRenamed());
           assertThat(inspector.clazz(B.class), isAbsent()); // Merged into C.
           assertThat(inspector.clazz(C.class), isPresentAndRenamed());
@@ -70,6 +79,11 @@
     runTest(
         name -> !name.equals(B.class.getTypeName()),
         inspector -> {
+          assertThat(inspector.programClass(A.class), isPresent());
+          assertThat(inspector.programClass(B.class), isPresent());
+          assertThat(inspector.programClass(C.class), isAbsent());
+        },
+        inspector -> {
           assertThat(inspector.clazz(A.class), isPresentAndNotRenamed());
           assertThat(inspector.clazz(B.class), isPresentAndNotRenamed());
           assertThat(inspector.clazz(C.class), isPresentAndRenamed());
@@ -81,6 +95,11 @@
     runTest(
         name -> !name.equals(C.class.getTypeName()),
         inspector -> {
+          assertThat(inspector.programClass(A.class), isPresent());
+          assertThat(inspector.programClass(B.class), isPresent());
+          assertThat(inspector.programClass(C.class), isPresent());
+        },
+        inspector -> {
           assertThat(inspector.clazz(A.class), isPresentAndNotRenamed());
           assertThat(inspector.clazz(B.class), isPresentAndNotRenamed());
           assertThat(inspector.clazz(C.class), isPresentAndNotRenamed());
diff --git a/src/test/java/com/android/tools/r8/partial/PartialCompilationBasicTest.java b/src/test/java/com/android/tools/r8/partial/PartialCompilationBasicTest.java
index 4783aaa..6206e13 100644
--- a/src/test/java/com/android/tools/r8/partial/PartialCompilationBasicTest.java
+++ b/src/test/java/com/android/tools/r8/partial/PartialCompilationBasicTest.java
@@ -43,19 +43,15 @@
         .compile()
         .inspectR8Input(
             inspector -> {
-              // TODO(b/309743298): These are all present as inspection currently also look at
-              //  classpath.
-              assertThat(inspector.clazz(A.class), isPresent());
-              assertThat(inspector.clazz(B.class), isPresent());
-              assertThat(inspector.clazz(Main.class), isPresent());
+              assertThat(inspector.programClass(A.class), isAbsent());
+              assertThat(inspector.programClass(B.class), isPresent());
+              assertThat(inspector.programClass(Main.class), isPresent());
             })
         .inspectD8Input(
-            // TODO(b/309743298): These are all present as inspection currently also look at
-            //  classpath.
             inspector -> {
-              assertThat(inspector.clazz(A.class), isPresent());
-              assertThat(inspector.clazz(B.class), isPresent());
-              assertThat(inspector.clazz(Main.class), isPresent());
+              assertThat(inspector.programClass(A.class), isPresent());
+              assertThat(inspector.programClass(B.class), isAbsent());
+              assertThat(inspector.programClass(Main.class), isAbsent());
             })
         .inspectR8Output(
             inspector -> {
@@ -73,6 +69,7 @@
             inspector -> {
               assertThat(inspector.clazz(A.class), isPresent());
               assertThat(inspector.clazz(B.class), isAbsent());
+              assertThat(inspector.clazz(Main.class), isPresent());
             })
         .run(parameters.getRuntime(), Main.class, getClass().getTypeName())
         .assertSuccessWithOutputLines("Instantiated", "Not instantiated");
@@ -90,17 +87,17 @@
             inspector -> {
               // TODO(b/309743298): These are all present as inspection currently also look at
               //  classpath.
-              assertThat(inspector.clazz(A.class), isPresent());
-              assertThat(inspector.clazz(B.class), isPresent());
-              assertThat(inspector.clazz(Main.class), isPresent());
+              assertThat(inspector.programClass(A.class), isPresent());
+              assertThat(inspector.programClass(B.class), isAbsent());
+              assertThat(inspector.programClass(Main.class), isPresent());
             })
         .inspectD8Input(
             inspector -> {
               // TODO(b/309743298): These are all present as inspection currently also look at
               //  classpath.
-              assertThat(inspector.clazz(A.class), isPresent());
-              assertThat(inspector.clazz(B.class), isPresent());
-              assertThat(inspector.clazz(Main.class), isPresent());
+              assertThat(inspector.programClass(A.class), isAbsent());
+              assertThat(inspector.programClass(B.class), isPresent());
+              assertThat(inspector.programClass(Main.class), isAbsent());
             })
         .inspectR8Output(
             inspector -> {
@@ -118,6 +115,7 @@
             inspector -> {
               assertThat(inspector.clazz(A.class), isAbsent());
               assertThat(inspector.clazz(B.class), isPresent());
+              assertThat(inspector.clazz(Main.class), isPresent());
             })
         .run(parameters.getRuntime(), Main.class, getClass().getTypeName())
         .assertSuccessWithOutputLines("Not instantiated", "Instantiated");
diff --git a/src/test/testbase/java/com/android/tools/r8/R8PartialTestCompileResult.java b/src/test/testbase/java/com/android/tools/r8/R8PartialTestCompileResult.java
index 8bdc393..2ff5569 100644
--- a/src/test/testbase/java/com/android/tools/r8/R8PartialTestCompileResult.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8PartialTestCompileResult.java
@@ -96,7 +96,7 @@
 
   public <E extends Throwable> R8PartialTestCompileResult inspectD8Input(
       ThrowingConsumer<CodeInspector, E> consumer) throws IOException, E {
-    consumer.accept(inspectorR8Input());
+    consumer.accept(inspectorD8Input());
     return self();
   }
 
diff --git a/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index 7c06d42..d055bdc 100644
--- a/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
+++ b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -4,6 +4,8 @@
 package com.android.tools.r8.utils.codeinspector;
 
 import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
+import static com.android.tools.r8.utils.codeinspector.CodeInspector.ClassType.ANY;
+import static com.android.tools.r8.utils.codeinspector.CodeInspector.ClassType.PROGRAM;
 
 import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.StringResource;
@@ -78,6 +80,11 @@
   final Map<String, String> obfuscatedToOriginalMapping;
   private Retracer lazyRetracer = null;
 
+  public enum ClassType {
+    PROGRAM,
+    ANY
+  }
+
   public static MethodSignature MAIN =
       new MethodSignature("main", "void", new String[] {"java.lang.String[]"});
 
@@ -293,6 +300,10 @@
     return rewriter.getSignature();
   }
 
+  public ClassSubject clazz(Class<?> clazz, ClassType classType) {
+    return clazz(Reference.classFromClass(clazz), classType);
+  }
+
   public ClassSubject clazz(Class<?> clazz) {
     return clazz(Reference.classFromClass(clazz));
   }
@@ -302,6 +313,10 @@
     return clazz(Reference.classFromTypeName(name));
   }
 
+  public ClassSubject programClass(Class<?> clazz) {
+    return clazz(Reference.classFromClass(clazz), PROGRAM);
+  }
+
   public ClassNameMapper getMapping() {
     return mapping;
   }
@@ -355,7 +370,7 @@
     }
   }
 
-  public ClassSubject clazz(ClassReference reference) {
+  public ClassSubject clazz(ClassReference reference, ClassType classType) {
     String descriptor = reference.getDescriptor();
     String name = DescriptorUtils.descriptorToJavaType(descriptor);
     ClassNamingForNameMapper naming = null;
@@ -374,13 +389,20 @@
         }
       }
     }
-    DexClass clazz = application.definitionFor(toDexTypeIgnorePrimitives(name));
+    DexClass clazz =
+        classType == ANY
+            ? application.definitionFor(toDexTypeIgnorePrimitives(name))
+            : application.programDefinitionFor(toDexTypeIgnorePrimitives(name));
     if (clazz == null) {
       return new AbsentClassSubject(this, reference);
     }
     return new FoundClassSubject(this, clazz, MappingWrapper.create(mapping, naming), reference);
   }
 
+  public ClassSubject clazz(ClassReference reference) {
+    return clazz(reference, ANY);
+  }
+
   public ClassSubject companionClassFor(Class<?> clazz) {
     return clazz(SyntheticItemsTestUtils.syntheticCompanionClass(clazz));
   }
