diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java
index 11c5285..972d058 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java
@@ -205,9 +205,12 @@
     for (Class clazz : CLASSES) {
       ClassSubject classSubject = codeInspector.clazz(clazz);
       assertThat(classSubject, isPresent());
-      classSubject.getDexClass().forEachMethod(m -> {
-        assertTrue(!m.isInstanceInitializer() || m.isPublicMethod());
-      });
+      classSubject
+          .getDexProgramClass()
+          .forEachMethod(
+              m -> {
+                assertTrue(!m.isInstanceInitializer() || m.isPublicMethod());
+              });
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/InnerClassAttributePublicizerTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/InnerClassAttributePublicizerTest.java
index 9322844..24ba1cd 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/InnerClassAttributePublicizerTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/InnerClassAttributePublicizerTest.java
@@ -54,7 +54,7 @@
     assertThat(classSubject, isPresent());
 
     InnerClassAttribute innerClassAttribute =
-        classSubject.getDexClass().getInnerClassAttributeForThisClass();
+        classSubject.getDexProgramClass().getInnerClassAttributeForThisClass();
     assertNotNull(innerClassAttribute);
 
     ClassAccessFlags accessFlags =
diff --git a/src/test/java/com/android/tools/r8/androidapi/GenerateAvailableApiExceptions.java b/src/test/java/com/android/tools/r8/androidapi/GenerateAvailableApiExceptions.java
index 83821f8..b6a1c72 100644
--- a/src/test/java/com/android/tools/r8/androidapi/GenerateAvailableApiExceptions.java
+++ b/src/test/java/com/android/tools/r8/androidapi/GenerateAvailableApiExceptions.java
@@ -92,14 +92,14 @@
     if (!clazz.isPresent()) {
       return false;
     }
-    if (clazz.getDexClass().type == inspector.getFactory().objectType) {
+    if (clazz.getDexProgramClass().type == inspector.getFactory().objectType) {
       return false;
     }
-    if (clazz.getDexClass().type == inspector.getFactory().throwableType) {
+    if (clazz.getDexProgramClass().type == inspector.getFactory().throwableType) {
       return true;
     }
     return cache.computeIfAbsent(
-        clazz.getDexClass(),
+        clazz.getDexProgramClass(),
         c -> {
           return c.superType != null
               && isThrowable(inspector.clazz(c.superType.toSourceString()), cache, inspector);
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java b/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
index 2c46b40..6a0cf4d 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
@@ -151,7 +151,7 @@
     DexCode code = fooFromCls2InAbsCls.getMethod().getCode().asDexCode();
     checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class));
     InvokeVirtual invoke = (InvokeVirtual) code.instructions[0];
-    assertEquals(absSubject.getDexClass().type, invoke.getMethod().holder);
+    assertEquals(absSubject.getDexProgramClass().type, invoke.getMethod().holder);
 
     // Cls1#foo has been moved to AbsCls#foo as a result of bridge hoisting.
     MethodSubject fooInCls1 = cls1Subject.method("void", "foo", "java.lang.String");
@@ -162,7 +162,7 @@
     code = fooFromCls1InAbsCls.getMethod().getCode().asDexCode();
     checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class));
     invoke = (InvokeVirtual) code.instructions[0];
-    assertEquals(absSubject.getDexClass().type, invoke.getMethod().holder);
+    assertEquals(absSubject.getDexProgramClass().type, invoke.getMethod().holder);
   }
 
   /**
@@ -259,7 +259,7 @@
     DexCode code = barInCls2.getMethod().getCode().asDexCode();
     checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class));
     InvokeVirtual invoke = (InvokeVirtual) code.instructions[0];
-    assertEquals(baseSubject.getDexClass().type, invoke.getMethod().holder);
+    assertEquals(baseSubject.getDexProgramClass().type, invoke.getMethod().holder);
 
     // Cls1#foo has been moved to Base#foo as a result of bridge hoisting.
     MethodSubject fooInCls1 = cls1Subject.method("void", "foo", "java.lang.Integer");
@@ -270,7 +270,7 @@
     code = fooInBase.getMethod().getCode().asDexCode();
     checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class));
     invoke = (InvokeVirtual) code.instructions[0];
-    assertEquals(baseSubject.getDexClass().type, invoke.getMethod().holder);
+    assertEquals(baseSubject.getDexProgramClass().type, invoke.getMethod().holder);
   }
 
   /**
@@ -355,7 +355,7 @@
     DexCode code = barInSub.getMethod().getCode().asDexCode();
     checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class));
     InvokeVirtual invoke = (InvokeVirtual) code.instructions[0];
-    assertEquals(baseSubject.getDexClass().type, invoke.getMethod().holder);
+    assertEquals(baseSubject.getDexProgramClass().type, invoke.getMethod().holder);
   }
 
   /*
@@ -428,7 +428,7 @@
     DexCode code = barInSub.getMethod().getCode().asDexCode();
     checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class));
     InvokeVirtual invoke = (InvokeVirtual) code.instructions[0];
-    assertEquals(baseSubject.getDexClass().type, invoke.getMethod().holder);
+    assertEquals(baseSubject.getDexProgramClass().type, invoke.getMethod().holder);
   }
 
   private AndroidApp runAndVerifyOnJvmAndArt(
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonSuperclassBridgeHoistingTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonSuperclassBridgeHoistingTest.java
index 353a9b9..9c4a0d6 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonSuperclassBridgeHoistingTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonSuperclassBridgeHoistingTest.java
@@ -55,7 +55,7 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
-    assertEquals(0, aClassSubject.getDexClass().virtualMethods().size());
+    assertEquals(0, aClassSubject.getDexProgramClass().virtualMethods().size());
 
     ClassSubject b1ClassSubject = inspector.clazz(B.class);
     assertThat(b1ClassSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java
index 451a255..d767975 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java
@@ -84,7 +84,7 @@
   }
 
   private void assertCollectionMethodsPresentWithCorrectDispatch(CodeInspector inspector) {
-    DexClass collectionDispatch = inspector.clazz("j$.util.Collection$-EL").getDexClass();
+    DexClass collectionDispatch = inspector.clazz("j$.util.Collection$-EL").getDexProgramClass();
     for (DexEncodedMethod method : collectionDispatch.methods()) {
       int numCheckCast =
           (int)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java
index 835d1cb..83dc73e 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java
@@ -10,7 +10,6 @@
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
@@ -99,12 +98,12 @@
                                 "com.android.tools.r8.desugar.desugaredlibrary.conversiontests")
                         && !c.getOriginalName().contains("Executor")
                         && !c.getOriginalName().contains("$-CC")
-                        && !c.getDexClass().isInterface())
+                        && !c.getDexProgramClass().isInterface())
             .collect(toSingle());
     assertEquals(
         "Missing duplicated forEach",
         2,
-        myCollection.getDexClass().virtualMethods().stream()
+        myCollection.getDexProgramClass().virtualMethods().stream()
             .filter(m -> m.method.name.toString().equals("forEach"))
             .count());
   }
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/FullNestOnProgramPathTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/FullNestOnProgramPathTest.java
index 55f40c4..e4447b53 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/FullNestOnProgramPathTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/FullNestOnProgramPathTest.java
@@ -168,7 +168,7 @@
         ImmutableList.of("NeverInline", "OutsideInliningNoAccess", "OutsideInliningWithAccess");
     inspector.forAllClasses(
         classSubject -> {
-          DexClass dexClass = classSubject.getDexClass();
+          DexClass dexClass = classSubject.getDexProgramClass();
           if (!nonNestClasses.contains(dexClass.type.getName())) {
             assertTrue(dexClass.isInANest());
             if (outerClassNames.contains(dexClass.type.getName())) {
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11D8CompilationTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11D8CompilationTest.java
index adbaddc..6fdfe97 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11D8CompilationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11D8CompilationTest.java
@@ -32,7 +32,8 @@
   }
 
   private static void assertNoNests(CodeInspector inspector) {
-    assertTrue(inspector.allClasses().stream().noneMatch(subj -> subj.getDexClass().isInANest()));
+    assertTrue(
+        inspector.allClasses().stream().noneMatch(subj -> subj.getDexProgramClass().isInANest()));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8BootstrapTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8BootstrapTest.java
index a4cc603..5a788bf 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8BootstrapTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8BootstrapTest.java
@@ -75,9 +75,11 @@
 
   private static void assertNests(CodeInspector inspector, boolean desugar) {
     if (desugar) {
-      assertTrue(inspector.allClasses().stream().noneMatch(subj -> subj.getDexClass().isInANest()));
+      assertTrue(
+          inspector.allClasses().stream().noneMatch(subj -> subj.getDexProgramClass().isInANest()));
     } else {
-      assertTrue(inspector.allClasses().stream().anyMatch(subj -> subj.getDexClass().isInANest()));
+      assertTrue(
+          inspector.allClasses().stream().anyMatch(subj -> subj.getDexProgramClass().isInANest()));
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8CompilationTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8CompilationTest.java
index 06112f5..762916e 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8CompilationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8CompilationTest.java
@@ -41,7 +41,8 @@
   private static final Path MAIN_KEEP = Paths.get("src/main/keep.txt");
 
   private static void assertNoNests(CodeInspector inspector) {
-    assertTrue(inspector.allClasses().stream().noneMatch(subj -> subj.getDexClass().isInANest()));
+    assertTrue(
+        inspector.allClasses().stream().noneMatch(subj -> subj.getDexProgramClass().isInANest()));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesUpdateTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesUpdateTest.java
index e0c7e12..816a233 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesUpdateTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesUpdateTest.java
@@ -107,7 +107,7 @@
   public static void assertNestAttributesCorrect(CodeInspector inspector) {
     assertTrue(inspector.allClasses().size() > 0);
     for (FoundClassSubject classSubject : inspector.allClasses()) {
-      DexClass clazz = classSubject.getDexClass();
+      DexClass clazz = classSubject.getDexProgramClass();
       if (clazz.isInANest()) {
         if (clazz.isNestHost()) {
           // All members are present with the clazz as host
@@ -116,8 +116,8 @@
             ClassSubject inner = inspector.clazz(PACKAGE_NAME + memberName);
             assertNotNull(
                 "The nest member " + memberName + " of " + clazz.type.getName() + " is missing",
-                inner.getDexClass());
-            assertSame(inner.getDexClass().getNestHost(), clazz.type);
+                inner.getDexProgramClass());
+            assertSame(inner.getDexProgramClass().getNestHost(), clazz.type);
           }
         } else {
           // Nest host is present and with the clazz as member
@@ -125,9 +125,9 @@
           ClassSubject host = inspector.clazz(PACKAGE_NAME + hostName);
           assertNotNull(
               "The nest host " + hostName + " of " + clazz.type.getName() + " is missing",
-              host.getDexClass());
+              host.getDexProgramClass());
           assertTrue(
-              host.getDexClass().getNestMembersClassAttributes().stream()
+              host.getDexProgramClass().getNestMembersClassAttributes().stream()
                   .anyMatch(attr -> attr.getNestMember() == clazz.type));
         }
       }
diff --git a/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsFileWithNoClassesTest.java b/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsFileWithNoClassesTest.java
index 57fe4b3..c987370 100644
--- a/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsFileWithNoClassesTest.java
+++ b/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsFileWithNoClassesTest.java
@@ -65,7 +65,7 @@
     inspector.getMarkers().forEach(m -> assertTrue(m.getHasChecksums()));
     // It may be prudent to check that the dex file also has the encoding string, but that is
     // not easily accessed.
-    inspector.allClasses().forEach(c -> c.getDexClass().asProgramClass().getChecksum());
+    inspector.allClasses().forEach(c -> c.getDexProgramClass().asProgramClass().getChecksum());
   }
 
   public static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/dexfilemerger/NonAsciiClassNameChecksumTest.java b/src/test/java/com/android/tools/r8/dexfilemerger/NonAsciiClassNameChecksumTest.java
index 8e4700b..b91a645 100644
--- a/src/test/java/com/android/tools/r8/dexfilemerger/NonAsciiClassNameChecksumTest.java
+++ b/src/test/java/com/android/tools/r8/dexfilemerger/NonAsciiClassNameChecksumTest.java
@@ -83,7 +83,7 @@
   private void checkIncludesChecksum(CodeInspector inspector, Class<?> clazz) {
     ClassSubject classSubject = inspector.clazz(getTransformedName(clazz));
     assertThat(classSubject, isPresent());
-    assertTrue(classSubject.getDexClass().asProgramClass().getChecksum() > 0);
+    assertTrue(classSubject.getDexProgramClass().asProgramClass().getChecksum() > 0);
   }
 
   static class TaestClass {
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/FailingEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/FailingEnumUnboxingTest.java
index ad16ee1..0441cbf 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/FailingEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/FailingEnumUnboxingTest.java
@@ -82,12 +82,13 @@
   }
 
   private void assertEnumsAsExpected(CodeInspector inspector) {
-    assertEquals(1, inspector.clazz(EnumInterface.class).getDexClass().interfaces.size());
+    assertEquals(1, inspector.clazz(EnumInterface.class).getDexProgramClass().interfaces.size());
 
     assertTrue(inspector.clazz(EnumStaticField.class).uniqueFieldWithName("X").isPresent());
     assertTrue(inspector.clazz(EnumInstanceField.class).uniqueFieldWithName("a").isPresent());
 
-    assertEquals(5, inspector.clazz(EnumStaticMethod.class).getDexClass().directMethods().size());
+    assertEquals(
+        5, inspector.clazz(EnumStaticMethod.class).getDexProgramClass().directMethods().size());
     assertEquals(1, inspector.clazz(EnumVirtualMethod.class).virtualMethods().size());
   }
 
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/FailingMethodEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/FailingMethodEnumUnboxingTest.java
index 8e7be57..411a747 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/FailingMethodEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/FailingMethodEnumUnboxingTest.java
@@ -85,9 +85,10 @@
     // Check all as expected (else we test nothing)
 
     assertEquals(
-        1, inspector.clazz(InstanceFieldPutObject.class).getDexClass().instanceFields().size());
+        1,
+        inspector.clazz(InstanceFieldPutObject.class).getDexProgramClass().instanceFields().size());
     assertEquals(
-        1, inspector.clazz(StaticFieldPutObject.class).getDexClass().staticFields().size());
+        1, inspector.clazz(StaticFieldPutObject.class).getDexProgramClass().staticFields().size());
 
     assertTrue(inspector.clazz(FailingPhi.class).uniqueMethodWithName("switchOn").isPresent());
   }
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/FieldPutEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/FieldPutEnumUnboxingTest.java
index eedc8f1..8ab4bcf 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/FieldPutEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/FieldPutEnumUnboxingTest.java
@@ -56,9 +56,10 @@
             .inspect(
                 i -> {
                   assertEquals(
-                      1, i.clazz(InstanceFieldPut.class).getDexClass().instanceFields().size());
+                      1,
+                      i.clazz(InstanceFieldPut.class).getDexProgramClass().instanceFields().size());
                   assertEquals(
-                      1, i.clazz(StaticFieldPut.class).getDexClass().staticFields().size());
+                      1, i.clazz(StaticFieldPut.class).getDexProgramClass().staticFields().size());
                 });
 
     for (Class<?> input : INPUTS) {
diff --git a/src/test/java/com/android/tools/r8/graph/GenericSignatureTest.java b/src/test/java/com/android/tools/r8/graph/GenericSignatureTest.java
index 088b075..5001645 100644
--- a/src/test/java/com/android/tools/r8/graph/GenericSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/graph/GenericSignatureTest.java
@@ -101,7 +101,7 @@
     //
 
     // class <T:GenericSignatureTestClassA<T>.Y>CYY<T extends A<T>.Y> extends CY<T>
-    DexClass clazz = cyy.getDexClass();
+    DexClass clazz = cyy.getDexProgramClass();
     assertNotNull(clazz);
     classSignature = Parser.toClassSignature(clazz, appView);
     assertNotNull(classSignature);
@@ -112,14 +112,14 @@
     assertNull(formalTypeParameter.interfaceBounds);
     assertTrue(formalTypeParameter.classBound.isClassTypeSignature());
     ClassTypeSignature classBoundSignature = formalTypeParameter.classBound.asClassTypeSignature();
-    assertEquals(y.getDexClass().type, classBoundSignature.innerTypeSignature.type);
+    assertEquals(y.getDexProgramClass().type, classBoundSignature.innerTypeSignature.type);
     assertEquals(1, classBoundSignature.typeArguments.size());
     assertEquals(
         "T", classBoundSignature.typeArguments.get(0).asTypeVariableSignature().typeVariable);
 
     assertTrue(classSignature.superInterfaceSignatures.isEmpty());
     classTypeSignature = classSignature.superClassSignature;
-    assertEquals(cy.getDexClass().type, classTypeSignature.type);
+    assertEquals(cy.getDexProgramClass().type, classTypeSignature.type);
     typeArguments = classTypeSignature.typeArguments;
     assertEquals(1, typeArguments.size());
     typeArgument = typeArguments.get(0);
@@ -159,13 +159,13 @@
     FormalTypeParameter methodFormalParameter = methodTypeSignature.formalTypeParameters.get(0);
     assertTrue(methodFormalParameter.classBound.isClassTypeSignature());
     assertEquals(
-        y.getDexClass().getType(),
+        y.getDexProgramClass().getType(),
         methodFormalParameter.classBound.asClassTypeSignature().innerTypeSignature.type);
     assertNotNull(methodFormalParameter.interfaceBounds);
     assertEquals(1, methodFormalParameter.interfaceBounds.size());
     FieldTypeSignature interfaceBound = methodFormalParameter.interfaceBounds.get(0);
     assertTrue(interfaceBound.isClassTypeSignature());
-    assertEquals(i.getDexClass().getType(), interfaceBound.asClassTypeSignature().type);
+    assertEquals(i.getDexProgramClass().getType(), interfaceBound.asClassTypeSignature().type);
 
     // return type: A$Y$YY
     returnType = methodTypeSignature.returnType();
@@ -186,7 +186,7 @@
     assertTrue(elementSignature.isFieldTypeSignature());
     assertTrue(elementSignature.asFieldTypeSignature().isClassTypeSignature());
     classTypeSignature = elementSignature.asFieldTypeSignature().asClassTypeSignature();
-    assertEquals(b.getDexClass().type, classTypeSignature.type);
+    assertEquals(b.getDexProgramClass().type, classTypeSignature.type);
 
     // Function<A$Y$ZZ<TT>, A$Y$YY> convertToYY(Supplier<A$Y$ZZ<TT>>
     MethodSubject convertToYY = zz.uniqueMethodWithName("convertToYY");
@@ -246,26 +246,27 @@
   }
 
   private void check_A_Y(ClassSubject a, ClassSubject y, ClassTypeSignature signature) {
-    assertEquals(a.getDexClass().type, signature.type);
+    assertEquals(a.getDexProgramClass().type, signature.type);
     List<FieldTypeSignature> typeArguments = signature.typeArguments;
     assertEquals(1, typeArguments.size());
     FieldTypeSignature typeArgument = typeArguments.get(0);
     assertTrue(typeArgument.isTypeVariableSignature());
     assertEquals("T", typeArgument.asTypeVariableSignature().typeVariable);
-    assertEquals(y.getDexClass().type, signature.innerTypeSignature.type);
+    assertEquals(y.getDexProgramClass().type, signature.innerTypeSignature.type);
   }
 
   private void check_A_Y_YY(
       ClassSubject a, ClassSubject y, ClassSubject yy, ClassTypeSignature signature) {
     check_A_Y(a, y, signature);
-    assertEquals(yy.getDexClass().type, signature.innerTypeSignature.innerTypeSignature.type);
+    assertEquals(
+        yy.getDexProgramClass().type, signature.innerTypeSignature.innerTypeSignature.type);
   }
 
   private void check_A_Y_ZZ(
       ClassSubject a, ClassSubject y, ClassSubject zz, ClassTypeSignature signature) {
     check_A_Y(a, y, signature);
     ClassTypeSignature innerMost = signature.innerTypeSignature.innerTypeSignature;
-    assertEquals(zz.getDexClass().type, innerMost.type);
+    assertEquals(zz.getDexProgramClass().type, innerMost.type);
     List<FieldTypeSignature> typeArguments = innerMost.typeArguments;
     assertEquals(1, typeArguments.size());
     FieldTypeSignature typeArgument = typeArguments.get(0);
diff --git a/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java b/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
index 23dc574..8c98b46 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
@@ -186,7 +186,8 @@
   }
 
   private void verifyMethodToInvokeValuesAreAbsent(CodeInspector outputInspector) {
-    DexType methodToInvokeType = outputInspector.clazz(METHOD_TO_INVOKE_ENUM).getDexClass().type;
+    DexType methodToInvokeType =
+        outputInspector.clazz(METHOD_TO_INVOKE_ENUM).getDexProgramClass().type;
     for (String main : mains) {
       MethodSubject mainMethodSubject = outputInspector.clazz(main).mainMethod();
       assertThat(mainMethodSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java b/src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java
index 60975b5..3c3aee6 100644
--- a/src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java
+++ b/src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java
@@ -59,11 +59,11 @@
     assertThat(clazz, isPresent());
 
     // There are two direct methods, but only because one is <init>.
-    assertEquals(2, clazz.getDexClass().directMethods().size());
+    assertEquals(2, clazz.getDexProgramClass().directMethods().size());
     assertThat(clazz.method("void", "<init>", ImmutableList.of()), isPresent());
 
     // There is only one virtual method.
-    assertEquals(1, clazz.getDexClass().virtualMethods().size());
+    assertEquals(1, clazz.getDexProgramClass().virtualMethods().size());
   }
 
   @Test
@@ -94,7 +94,7 @@
     assertThat(clazz, isPresent());
 
     // Redundant fields have been removed.
-    assertEquals(1, clazz.getDexClass().instanceFields().size());
-    assertEquals(1, clazz.getDexClass().staticFields().size());
+    assertEquals(1, clazz.getDexProgramClass().instanceFields().size());
+    assertEquals(1, clazz.getDexProgramClass().staticFields().size());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b111893131/B111893131.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b111893131/B111893131.java
index cebcd05..ed54024 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b111893131/B111893131.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b111893131/B111893131.java
@@ -89,7 +89,7 @@
     CodeInspector inspector = new CodeInspector(app);
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(classSubject, isPresent());
-    DexClass clazz = classSubject.getDexClass();
+    DexClass clazz = classSubject.getDexProgramClass();
     clazz.forEachMethod(encodedMethod -> {
       Code code = encodedMethod.getCode();
       assertTrue(code.isDexCode());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
index b5ad06f..fc87e9b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
@@ -346,7 +346,7 @@
   private List<String> instanceMethods(ClassSubject clazz) {
     assertNotNull(clazz);
     assertThat(clazz, isPresent());
-    return Streams.stream(clazz.getDexClass().methods())
+    return Streams.stream(clazz.getDexProgramClass().methods())
         .filter(method -> !method.isStatic())
         .map(method -> method.method.toSourceString())
         .sorted()
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedinterfaces/UnusedInterfaceRemovalTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedinterfaces/UnusedInterfaceRemovalTest.java
index d2fa3f8..8b2c2a1 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedinterfaces/UnusedInterfaceRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedinterfaces/UnusedInterfaceRemovalTest.java
@@ -59,11 +59,13 @@
 
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
-    assertEquals(2, aClassSubject.getDexClass().interfaces.size());
+    assertEquals(2, aClassSubject.getDexProgramClass().interfaces.size());
     assertEquals(
-        aClassSubject.getDexClass().interfaces.values[0], iClassSubject.getDexClass().type);
+        aClassSubject.getDexProgramClass().interfaces.values[0],
+        iClassSubject.getDexProgramClass().type);
     assertEquals(
-        aClassSubject.getDexClass().interfaces.values[1], jClassSubject.getDexClass().type);
+        aClassSubject.getDexProgramClass().interfaces.values[1],
+        jClassSubject.getDexProgramClass().type);
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedinterfaces/UnusedInterfaceWithDefaultMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedinterfaces/UnusedInterfaceWithDefaultMethodTest.java
index 90761db..9a342e1 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedinterfaces/UnusedInterfaceWithDefaultMethodTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedinterfaces/UnusedInterfaceWithDefaultMethodTest.java
@@ -60,9 +60,10 @@
 
     // Verify that J is not considered an unused interface, since it provides an implementation of
     // m() that happens to be used.
-    assertEquals(1, aClassSubject.getDexClass().interfaces.size());
+    assertEquals(1, aClassSubject.getDexProgramClass().interfaces.size());
     assertEquals(
-        jClassSubject.getDexClass().type, aClassSubject.getDexClass().interfaces.values[0]);
+        jClassSubject.getDexProgramClass().type,
+        aClassSubject.getDexProgramClass().interfaces.values[0]);
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
index 5d55ba2..d8419ca 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
@@ -66,10 +66,11 @@
   }
 
   private static Predicate<DexType> createLambdaCheck(CodeInspector inspector) {
-    Set<DexType> lambdaClasses = inspector.allClasses().stream()
-        .filter(clazz -> isLambda(clazz.getDexClass()))
-        .map(clazz -> clazz.getDexClass().type)
-        .collect(Collectors.toSet());
+    Set<DexType> lambdaClasses =
+        inspector.allClasses().stream()
+            .filter(clazz -> isLambda(clazz.getDexProgramClass()))
+            .map(clazz -> clazz.getDexProgramClass().type)
+            .collect(Collectors.toSet());
     return lambdaClasses::contains;
   }
 
diff --git a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingTest.java b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingTest.java
index 031163f..6aac431 100644
--- a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingTest.java
@@ -182,16 +182,17 @@
     }
 
     private void initGroupsAndLambdas() {
-      codeInspector.forAllClasses(clazz -> {
-        DexClass dexClass = clazz.getDexClass();
-        if (isLambdaOrGroup(dexClass)) {
-          if (isLambdaGroupClass(dexClass)) {
-            groups.add(dexClass);
-          } else {
-            lambdas.add(dexClass);
-          }
-        }
-      });
+      codeInspector.forAllClasses(
+          clazz -> {
+            DexClass dexClass = clazz.getDexProgramClass();
+            if (isLambdaOrGroup(dexClass)) {
+              if (isLambdaGroupClass(dexClass)) {
+                groups.add(dexClass);
+              } else {
+                lambdas.add(dexClass);
+              }
+            }
+          });
     }
 
     void assertLambdaGroups(Group... groups) {
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeAliasTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeAliasTest.java
index 51854f7..26ea8de 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeAliasTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeAliasTest.java
@@ -185,8 +185,8 @@
     // Check that typealias API = Itf has been rewritten correctly.
     KmTypeAliasSubject api = kmPackage.kmTypeAliasWithUniqueName("API");
     assertThat(api, isPresent());
-    assertThat(api.expandedType(), isDexClass(itf.getDexClass()));
-    assertThat(api.underlyingType(), isDexClass(itf.getDexClass()));
+    assertThat(api.expandedType(), isDexClass(itf.getDexProgramClass()));
+    assertThat(api.underlyingType(), isDexClass(itf.getDexProgramClass()));
 
     // Check that the type-alias APIs exist and that the expanded type is renamed.
     KmTypeAliasSubject apIs = kmPackage.kmTypeAliasWithUniqueName("APIs");
@@ -194,7 +194,7 @@
     assertEquals(arrayDescriptor, apIs.expandedType().descriptor());
     assertEquals(1, apIs.expandedType().typeArguments().size());
     KmTypeProjectionSubject expandedArgument = apIs.expandedType().typeArguments().get(0);
-    assertThat(expandedArgument.type(), isDexClass(itf.getDexClass()));
+    assertThat(expandedArgument.type(), isDexClass(itf.getDexProgramClass()));
 
     assertEquals(myAliasedArray.descriptor(packageName), apIs.underlyingType().descriptor());
     assertEquals(1, apIs.underlyingType().typeArguments().size());
@@ -219,15 +219,15 @@
     // typealias Arr1D<K> = Arr<K>
     KmTypeAliasSubject arr1D = kmPackage.kmTypeAliasWithUniqueName("Arr1D");
     assertThat(arr1D, isPresent());
-    assertThat(arr1D.expandedType(), isDexClass(arr.getDexClass()));
+    assertThat(arr1D.expandedType(), isDexClass(arr.getDexProgramClass()));
 
     // typealias Arr2D<K> = Arr1D<Arr1D<K>>
     KmTypeAliasSubject arr2D = kmPackage.kmTypeAliasWithUniqueName("Arr2D");
     assertThat(arr2D, isPresent());
-    assertThat(arr2D.expandedType(), isDexClass(arr.getDexClass()));
+    assertThat(arr2D.expandedType(), isDexClass(arr.getDexProgramClass()));
     assertEquals(1, arr2D.expandedType().typeArguments().size());
     KmTypeProjectionSubject arr2DexpandedArg = arr2D.expandedType().typeArguments().get(0);
-    assertThat(arr2DexpandedArg.type(), isDexClass(arr.getDexClass()));
+    assertThat(arr2DexpandedArg.type(), isDexClass(arr.getDexProgramClass()));
 
     assertEquals(arr1D.descriptor(packageName), arr2D.underlyingType().descriptor());
     assertEquals(1, arr2D.underlyingType().typeArguments().size());
@@ -282,6 +282,6 @@
     assertThat(classWithCompanionC, isPresent());
 
     ClassSubject companionClazz = inspector.clazz(packageName + ".ClassWithCompanion$Companion");
-    assertThat(classWithCompanionC.expandedType(), isDexClass(companionClazz.getDexClass()));
+    assertThat(classWithCompanionC.expandedType(), isDexClass(companionClazz.getDexProgramClass()));
   }
 }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeArgumentsTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeArgumentsTest.java
index a158b99..2e3dd21 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeArgumentsTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeArgumentsTest.java
@@ -213,12 +213,13 @@
     KmTypeParameterSubject methodTypeParameter = funGenericsWithUpperBounds.typeParameters().get(0);
     List<KmTypeSubject> upperBounds = methodTypeParameter.upperBounds();
     assertEquals(2, upperBounds.size());
-    assertThat(upperBounds.get(0), isDexClass(someClass.getDexClass()));
+    assertThat(upperBounds.get(0), isDexClass(someClass.getDexProgramClass()));
     assertEquals(KT_COMPARABLE, upperBounds.get(1).descriptor());
     // Check that the upper bound has a type argument.
     assertEquals(1, upperBounds.get(1).typeArguments().size());
     assertThat(
-        upperBounds.get(1).typeArguments().get(0).type(), isDexClass(someClass.getDexClass()));
+        upperBounds.get(1).typeArguments().get(0).type(),
+        isDexClass(someClass.getDexProgramClass()));
   }
 
   private void inspectCoVariant(CodeInspector inspector) {
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
index 627a059..ad8c526 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
@@ -148,7 +148,7 @@
     assertEquals(countInABar, renamedYetFoundIdentifierCount);
 
     renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, aClass.getDexClass().staticFields());
+        countRenamedClassIdentifier(inspector, aClass.getDexProgramClass().staticFields());
     assertEquals(countInAFields, renamedYetFoundIdentifierCount);
   }
 
@@ -208,7 +208,7 @@
     assertEquals(0, renamedYetFoundIdentifierCount);
 
     renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, aClass.getDexClass().staticFields());
+        countRenamedClassIdentifier(inspector, aClass.getDexProgramClass().staticFields());
     assertEquals(0, renamedYetFoundIdentifierCount);
   }
 
@@ -229,7 +229,7 @@
     assertEquals(1, renamedYetFoundIdentifierCount);
 
     renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, aClass.getDexClass().staticFields());
+        countRenamedClassIdentifier(inspector, aClass.getDexProgramClass().staticFields());
     assertEquals(2, renamedYetFoundIdentifierCount);
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/NonMemberClassTest.java b/src/test/java/com/android/tools/r8/naming/NonMemberClassTest.java
index 04c39b4..f777cda 100644
--- a/src/test/java/com/android/tools/r8/naming/NonMemberClassTest.java
+++ b/src/test/java/com/android/tools/r8/naming/NonMemberClassTest.java
@@ -117,9 +117,12 @@
       }
       assertEquals(
           expectedNumberOfNonMemberInnerClasses,
-          inspector.allClasses().stream().filter(classSubject ->
-              classSubject.getDexClass().isLocalClass()
-                  || classSubject.getDexClass().isAnonymousClass()).count());
+          inspector.allClasses().stream()
+              .filter(
+                  classSubject ->
+                      classSubject.getDexProgramClass().isLocalClass()
+                          || classSubject.getDexProgramClass().isAnonymousClass())
+              .count());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/RenameSourceFileRetraceTest.java b/src/test/java/com/android/tools/r8/naming/RenameSourceFileRetraceTest.java
index 4de8e4b..6f5aade 100644
--- a/src/test/java/com/android/tools/r8/naming/RenameSourceFileRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/RenameSourceFileRetraceTest.java
@@ -125,7 +125,7 @@
   private void inspectSourceFileForClass(CodeInspector inspector, Class<?> clazz, String expected) {
     ClassSubject classToBeMinifiedSubject = inspector.clazz(clazz);
     assertThat(classToBeMinifiedSubject, isPresent());
-    DexClass dexClass = classToBeMinifiedSubject.getDexClass();
+    DexClass dexClass = classToBeMinifiedSubject.getDexProgramClass();
     String actualString = dexClass.sourceFile == null ? null : dexClass.sourceFile.toString();
     assertEquals(expected, actualString);
   }
diff --git a/src/test/java/com/android/tools/r8/regress/B76025099.java b/src/test/java/com/android/tools/r8/regress/B76025099.java
index 5c5f494..59cfbe8 100644
--- a/src/test/java/com/android/tools/r8/regress/B76025099.java
+++ b/src/test/java/com/android/tools/r8/regress/B76025099.java
@@ -143,7 +143,7 @@
     FieldAccessInstructionSubject fieldAccessInstruction =
         (FieldAccessInstructionSubject) instruction;
     assertEquals("name", fieldAccessInstruction.name());
-    assertTrue(fieldAccessInstruction.holder().is(impl.getDexClass().type.toString()));
+    assertTrue(fieldAccessInstruction.holder().is(impl.getDexProgramClass().type.toString()));
 
     assertNotNull(findInstructionOrNull(iterator, InstructionSubject::isReturnVoid));
 
diff --git a/src/test/java/com/android/tools/r8/regress/Regress37740372.java b/src/test/java/com/android/tools/r8/regress/Regress37740372.java
index 34e4f3e..8047716 100644
--- a/src/test/java/com/android/tools/r8/regress/Regress37740372.java
+++ b/src/test/java/com/android/tools/r8/regress/Regress37740372.java
@@ -126,7 +126,7 @@
 
   private void assertIsJavaLangObjet(ClassSubject clazz) {
     assertTrue(clazz.getOriginalDescriptor().equals("Ljava/lang/Object;"));
-    assertNull(clazz.getDexClass().superType);
+    assertNull(clazz.getDexProgramClass().superType);
   }
 
   private void checkApplicationOnlyHasJavaLangObject(AndroidApp app) throws Throwable {
diff --git a/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java b/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
index b47b279..9690ea6 100644
--- a/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
+++ b/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
@@ -110,7 +110,8 @@
     for (FoundClassSubject clazz : originalInspector.allClasses()) {
       ClassSubject relocatedClass = relocatedInspector.clazz(clazz.getFinalName());
       assertThat(relocatedClass, isPresent());
-      assertEquals(clazz.getDexClass().sourceFile, relocatedClass.getDexClass().sourceFile);
+      assertEquals(
+          clazz.getDexProgramClass().sourceFile, relocatedClass.getDexProgramClass().sourceFile);
       for (FoundMethodSubject originalMethod : clazz.allMethods()) {
         MethodSubject relocatedMethod = relocatedClass.method(originalMethod.asMethodReference());
         assertThat(relocatedMethod, isPresent());
@@ -195,7 +196,7 @@
     int packageNameCounter = 0;
     // Generate a mapping for each package name directly below com.android.tools.r8.
     for (FoundClassSubject clazz : inspector.allClasses()) {
-      String packageName = clazz.getDexClass().getType().getPackageName();
+      String packageName = clazz.getDexProgramClass().getType().getPackageName();
       String prefix = "com.android.tools.r8.";
       if (!packageName.startsWith(prefix)) {
         continue;
@@ -280,8 +281,8 @@
     for (FoundClassSubject originalSubject : originalInspector.allClasses()) {
       ClassSubject relocatedSubject = relocatedInspector.clazz(originalSubject.getFinalName());
       assertThat(relocatedSubject, isPresent());
-      DexClass originalClass = originalSubject.getDexClass();
-      DexClass relocatedClass = relocatedSubject.getDexClass();
+      DexClass originalClass = originalSubject.getDexProgramClass();
+      DexClass relocatedClass = relocatedSubject.getDexProgramClass();
       assertEquals(originalClass.isNestHost(), relocatedClass.isNestHost());
       assertEquals(originalClass.isNestMember(), relocatedClass.isNestMember());
       if (originalClass.isInANest()) {
diff --git a/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java b/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java
index 795ec4d..7261198 100644
--- a/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java
@@ -99,7 +99,7 @@
     ClassSubject classSubject = codeInspector.clazz(B111974287.class);
     assertThat(classSubject, isPresent());
     assertThat(classSubject, not(isRenamed()));
-    DexClass clazz = classSubject.getDexClass();
+    DexClass clazz = classSubject.getDexProgramClass();
     assertEquals(3, clazz.virtualMethods().size());
     for (DexEncodedMethod encodedMethod : clazz.virtualMethods()) {
       assertTrue(encodedMethod.method.name.toString().startsWith("foo"));
@@ -140,7 +140,7 @@
     ClassSubject classSubject = codeInspector.clazz(B111974287.class);
     assertThat(classSubject, isPresent());
     assertThat(classSubject, not(isRenamed()));
-    DexClass clazz = classSubject.getDexClass();
+    DexClass clazz = classSubject.getDexProgramClass();
     assertEquals(3, clazz.virtualMethods().size());
     for (DexEncodedMethod encodedMethod : clazz.virtualMethods()) {
       assertTrue(encodedMethod.method.name.toString().startsWith("foo"));
@@ -162,7 +162,7 @@
     ClassSubject classSubject = codeInspector.clazz(B111974287.class);
     assertThat(classSubject, isPresent());
     assertThat(classSubject, not(isRenamed()));
-    DexClass clazz = classSubject.getDexClass();
+    DexClass clazz = classSubject.getDexProgramClass();
     assertEquals(3, clazz.virtualMethods().size());
     for (DexEncodedMethod encodedMethod : clazz.virtualMethods()) {
       assertTrue(encodedMethod.method.name.toString().startsWith("foo"));
diff --git a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
index 0b246a5..8365345 100644
--- a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
@@ -135,8 +135,10 @@
   }
 
   protected static void checkSameStructure(CodeInspector ref, CodeInspector inspector) {
-    ref.forAllClasses(refClazz -> checkSameStructure(refClazz,
-        inspector.clazz(refClazz.getDexClass().toSourceString())));
+    ref.forAllClasses(
+        refClazz ->
+            checkSameStructure(
+                refClazz, inspector.clazz(refClazz.getDexProgramClass().toSourceString())));
   }
 
   private static void checkSameStructure(ClassSubject refClazz, ClassSubject clazz) {
@@ -149,7 +151,10 @@
     MethodSignature signature = refMethod.getOriginalSignature();
     // Don't check for existence of class initializers, as the code optimization can remove them.
     if (!refMethod.isClassInitializer()) {
-      Assert.assertTrue("Missing Method: " + clazz.getDexClass().toSourceString() + "."
+      Assert.assertTrue(
+          "Missing Method: "
+              + clazz.getDexProgramClass().toSourceString()
+              + "."
               + signature.toString(),
           clazz.method(signature).isPresent());
     }
diff --git a/src/test/java/com/android/tools/r8/shaking/annotations/PrunedOrMergedAnnotationTest.java b/src/test/java/com/android/tools/r8/shaking/annotations/PrunedOrMergedAnnotationTest.java
index 9b11b86..16c7d4f 100644
--- a/src/test/java/com/android/tools/r8/shaking/annotations/PrunedOrMergedAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/annotations/PrunedOrMergedAnnotationTest.java
@@ -59,7 +59,7 @@
         .inspect(
             inspector -> {
               assertThat(inspector.clazz(A.class), not(isPresent()));
-              DexType mergedType = inspector.clazz(B.class).getDexClass().type;
+              DexType mergedType = inspector.clazz(B.class).getDexProgramClass().type;
               ClassSubject classC = inspector.clazz(C.class);
               assertThat(classC, isPresent());
               DexEncodedAnnotation annotation =
diff --git a/src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesDotsTest.java b/src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesDotsTest.java
index 5a978c6..1caf4f2 100644
--- a/src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesDotsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesDotsTest.java
@@ -69,12 +69,14 @@
 
   private void inspect(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(Main.class);
-    assertTrue(clazz.getDexClass().annotations().isEmpty());
+    assertTrue(clazz.getDexProgramClass().annotations().isEmpty());
     MethodSubject main = clazz.uniqueMethodWithName("main");
     assertTrue(main.getMethod().annotations().isEmpty());
     FieldSubject field = clazz.uniqueFieldWithName("field");
     assertTrue(field.getField().annotations().isEmpty());
-    assertTrue(clazz.getDexClass().sourceFile == null || clazz.getDexClass().sourceFile.size == 0);
+    assertTrue(
+        clazz.getDexProgramClass().sourceFile == null
+            || clazz.getDexProgramClass().sourceFile.size == 0);
     assertNull(main.getLineNumberTable());
     assertTrue(main.getLocalVariableTable().isEmpty());
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java
index 49af47a..2b5cd16 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java
@@ -55,7 +55,7 @@
       ImmutableList.of("pqr", "vw$", "abc", "def", "stu", "ghi", "jkl", "ea", "xyz_", "mno");
 
   private static void checkClassAndMemberInDictionary(ClassSubject clazz) {
-    String name = clazz.getDexClass().type.getName();
+    String name = clazz.getDexProgramClass().type.getName();
     if (!names.contains(name) && !name.equals("Shaking")) {
       throw new AssertionError();
     }
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java
index 52a756b..198b253 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java
@@ -70,25 +70,25 @@
   private void annotationRemovalHasNoInnerClassAnnotations(CodeInspector inspector) {
     ClassSubject outer = inspector.clazz("annotationremoval.OuterClass");
     Assert.assertTrue(outer.isPresent());
-    Assert.assertTrue(outer.getDexClass().getInnerClasses().isEmpty());
+    Assert.assertTrue(outer.getDexProgramClass().getInnerClasses().isEmpty());
     ClassSubject inner = inspector.clazz("annotationremoval.OuterClass$InnerClass");
     Assert.assertTrue(inner.isPresent());
-    Assert.assertNull(inner.getDexClass().getEnclosingMethod());
-    Assert.assertTrue(inner.getDexClass().getInnerClasses().isEmpty());
+    Assert.assertNull(inner.getDexProgramClass().getEnclosingMethod());
+    Assert.assertTrue(inner.getDexProgramClass().getInnerClasses().isEmpty());
     ClassSubject anonymous = inspector.clazz("annotationremoval.OuterClass$1");
     Assert.assertTrue(anonymous.isPresent());
-    Assert.assertNull(anonymous.getDexClass().getEnclosingMethod());
-    Assert.assertTrue(anonymous.getDexClass().getInnerClasses().isEmpty());
+    Assert.assertNull(anonymous.getDexProgramClass().getEnclosingMethod());
+    Assert.assertTrue(anonymous.getDexProgramClass().getInnerClasses().isEmpty());
     ClassSubject local = inspector.clazz("annotationremoval.OuterClass$1LocalMagic");
     Assert.assertTrue(local.isPresent());
-    Assert.assertNull(local.getDexClass().getEnclosingMethod());
-    Assert.assertTrue(local.getDexClass().getInnerClasses().isEmpty());
+    Assert.assertNull(local.getDexProgramClass().getEnclosingMethod());
+    Assert.assertTrue(local.getDexProgramClass().getInnerClasses().isEmpty());
   }
 
   private void annotationRemovalHasAllInnerClassAnnotations(CodeInspector inspector) {
     ClassSubject outer = inspector.clazz("annotationremoval.OuterClass");
     Assert.assertTrue(outer.isPresent());
-    Assert.assertFalse(outer.getDexClass().getInnerClasses().isEmpty());
+    Assert.assertFalse(outer.getDexProgramClass().getInnerClasses().isEmpty());
     ClassSubject inner = inspector.clazz("annotationremoval.OuterClass$InnerClass");
     Assert.assertTrue(inner.isPresent());
     Assert.assertTrue(inner.isMemberClass());
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
index ee8629f..91cd90c 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
@@ -119,8 +119,7 @@
 
     // The test contains only a member class so the enclosing-method attribute will be null.
     assertEquals(
-        forceProguardCompatibility,
-        !clazz.getDexClass().getInnerClasses().isEmpty());
+        forceProguardCompatibility, !clazz.getDexProgramClass().getInnerClasses().isEmpty());
     assertEquals(forceProguardCompatibility || keepAnnotations,
         clazz.annotation(annotationClass.getCanonicalName()).isPresent());
   }
@@ -447,9 +446,9 @@
     ClassSubject clazz = inspector.clazz(TestKeepAttributes.class);
     assertThat(clazz, isPresent());
     if (innerClasses || enclosingMethod) {
-      assertFalse(clazz.getDexClass().getInnerClasses().isEmpty());
+      assertFalse(clazz.getDexProgramClass().getInnerClasses().isEmpty());
     } else {
-      assertTrue(clazz.getDexClass().getInnerClasses().isEmpty());
+      assertTrue(clazz.getDexProgramClass().getInnerClasses().isEmpty());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/ConsequentRootSetWithSatisfiedDependentItemsTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/ConsequentRootSetWithSatisfiedDependentItemsTest.java
index f65d00b..040b2d4 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/ConsequentRootSetWithSatisfiedDependentItemsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/ConsequentRootSetWithSatisfiedDependentItemsTest.java
@@ -50,7 +50,7 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
-    assertFalse(aClassSubject.getDexClass().isAbstract());
+    assertFalse(aClassSubject.getDexProgramClass().isAbstract());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ExtendsMergedTypeDirectlyTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ExtendsMergedTypeDirectlyTest.java
index caa6f59..b6ab4b4 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ExtendsMergedTypeDirectlyTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ExtendsMergedTypeDirectlyTest.java
@@ -51,7 +51,8 @@
       // Check that TestClass no longer extends C.
       ClassSubject testClassSubject = inspector.clazz(TestClass.class);
       assertThat(testClassSubject, isPresent());
-      assertEquals("java.lang.Object", testClassSubject.getDexClass().superType.toSourceString());
+      assertEquals(
+          "java.lang.Object", testClassSubject.getDexProgramClass().superType.toSourceString());
 
       // Check that C is no longer present.
       assertThat(inspector.clazz(C.class), not(isPresent()));
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ExtendsMergedTypeIndirectlyTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ExtendsMergedTypeIndirectlyTest.java
index 7f6a1c6..ad6678c 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ExtendsMergedTypeIndirectlyTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ExtendsMergedTypeIndirectlyTest.java
@@ -47,6 +47,7 @@
 
     // Verify that TestClass still inherits from B.
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
-    assertEquals(B.class.getTypeName(), testClassSubject.getDexClass().superType.toSourceString());
+    assertEquals(
+        B.class.getTypeName(), testClassSubject.getDexProgramClass().superType.toSourceString());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ImplementsMergedTypeDirectlyTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ImplementsMergedTypeDirectlyTest.java
index ec06ebc..5c23b99 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ImplementsMergedTypeDirectlyTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ImplementsMergedTypeDirectlyTest.java
@@ -62,7 +62,7 @@
       // Check that TestClass no longer implements K.
       ClassSubject testClassSubject = inspector.clazz(TestClass.class);
       assertThat(testClassSubject, isPresent());
-      assertTrue(testClassSubject.getDexClass().interfaces.isEmpty());
+      assertTrue(testClassSubject.getDexProgramClass().interfaces.isEmpty());
 
       // Check that K is no longer present.
       assertThat(inspector.clazz(K.class), not(isPresent()));
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ImplementsMergedTypeIndirectlyTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ImplementsMergedTypeIndirectlyTest.java
index 2b76994..2f59834 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ImplementsMergedTypeIndirectlyTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/ImplementsMergedTypeIndirectlyTest.java
@@ -63,6 +63,7 @@
 
     // Verify that TestClass still implements J.
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
-    assertEquals(J.class.getTypeName(), testClassSubject.getDexClass().interfaces.toSourceString());
+    assertEquals(
+        J.class.getTypeName(), testClassSubject.getDexProgramClass().interfaces.toSourceString());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java
index fd4a6a7..7ea419c 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java
@@ -102,7 +102,8 @@
       if (enableVerticalClassMerging) {
         // Verify that SuperTestClass has been merged into TestClass.
         assertThat(inspector.clazz(SuperTestClass.class), not(isPresent()));
-        assertEquals("java.lang.Object", testClassSubject.getDexClass().superType.toSourceString());
+        assertEquals(
+            "java.lang.Object", testClassSubject.getDexProgramClass().superType.toSourceString());
 
         // Verify that TestClass.field has been removed.
         assertEquals(1, testClassSubject.allFields().size());
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java
index 99897fc..3961905 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java
@@ -104,7 +104,8 @@
       if (enableVerticalClassMerging) {
         // Verify that SuperTestClass has been merged into TestClass.
         assertThat(inspector.clazz(SuperTestClass.class), not(isPresent()));
-        assertEquals("java.lang.Object", testClassSubject.getDexClass().superType.toSourceString());
+        assertEquals(
+            "java.lang.Object", testClassSubject.getDexProgramClass().superType.toSourceString());
 
         // Verify that TestClass.method has been removed.
         List<FoundMethodSubject> methods =
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java
index 47f1c08..9173e66 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java
@@ -120,7 +120,8 @@
       if (enableVerticalClassMerging) {
         // Verify that SuperTestClass has been merged into TestClass.
         assertThat(inspector.clazz(SuperTestClass.class), not(isPresent()));
-        assertEquals("java.lang.Object", testClassSubject.getDexClass().superType.toSourceString());
+        assertEquals(
+            "java.lang.Object", testClassSubject.getDexProgramClass().superType.toSourceString());
 
         // Verify that TestClass.method has been removed.
         List<FoundMethodSubject> methods =
diff --git a/src/test/java/com/android/tools/r8/smali/OutlineTest.java b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
index e736ea7..09c1356 100644
--- a/src/test/java/com/android/tools/r8/smali/OutlineTest.java
+++ b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
@@ -865,13 +865,13 @@
     CodeInspector inspector = new CodeInspector(processedApplication);
     ClassSubject clazz = inspector.clazz(OutlineOptions.CLASS_NAME);
     assertTrue(clazz.isPresent());
-    assertEquals(3, clazz.getDexClass().directMethods().size());
+    assertEquals(3, clazz.getDexProgramClass().directMethods().size());
     // Collect the return types of the putlines for the body of method1 and method2.
     List<DexType> r = new ArrayList<>();
-    for (int i = 0; i < clazz.getDexClass().directMethods().size(); i++) {
-      if (clazz.getDexClass().directMethods().get(i).getCode().asDexCode().instructions[0]
+    for (int i = 0; i < clazz.getDexProgramClass().directMethods().size(); i++) {
+      if (clazz.getDexProgramClass().directMethods().get(i).getCode().asDexCode().instructions[0]
           instanceof InvokeVirtual) {
-        r.add(clazz.getDexClass().directMethods().get(i).method.proto.returnType);
+        r.add(clazz.getDexProgramClass().directMethods().get(i).method.proto.returnType);
       }
     }
     assert r.size() == 2;
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
index 6aad725..36c7766 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
@@ -112,7 +112,7 @@
     CodeInspector inspector = new CodeInspector(application);
     ClassSubject clazz = inspector.clazz(className);
     assertTrue(clazz.isPresent());
-    return clazz.getDexClass();
+    return clazz.getDexProgramClass();
   }
 
   protected DexClass getClass(DexApplication application, MethodSignature signature) {
@@ -124,7 +124,7 @@
       CodeInspector inspector = new CodeInspector(appPath);
       ClassSubject clazz = inspector.clazz(className);
       assertTrue(clazz.isPresent());
-      return clazz.getDexClass();
+      return clazz.getDexProgramClass();
     } catch (IOException | ExecutionException e) {
       throw new RuntimeException(e);
     }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
index 8786f30..92e0e10 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
@@ -5,7 +5,7 @@
 package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexProgramClass;
 import java.util.List;
 import java.util.function.Consumer;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
@@ -73,7 +73,7 @@
   }
 
   @Override
-  public DexClass getDexClass() {
+  public DexProgramClass getDexProgramClass() {
     return null;
   }
 
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
index c8c6142..a234c36 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.utils.codeinspector;
 
-import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.TypeReference;
@@ -156,7 +156,7 @@
     return dump.toString();
   }
 
-  public abstract DexClass getDexClass();
+  public abstract DexProgramClass getDexProgramClass();
 
   public abstract AnnotationSubject annotation(String name);
 
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
index fc5c38f..00d00ca 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.naming.ClassNamingForNameMapper;
@@ -221,8 +222,9 @@
   }
 
   @Override
-  public DexClass getDexClass() {
-    return dexClass;
+  public DexProgramClass getDexProgramClass() {
+    assert dexClass.isProgramClass();
+    return dexClass.asProgramClass();
   }
 
   public ClassSubject getSuperClass() {
@@ -334,7 +336,7 @@
   }
 
   public TypeSubject asTypeSubject() {
-    return new TypeSubject(codeInspector, getDexClass().type);
+    return new TypeSubject(codeInspector, getDexProgramClass().type);
   }
 
   @Override
@@ -348,7 +350,7 @@
             codeInspector.getFactory().kotlin, annotationSubject.getAnnotation());
     assertTrue(metadata instanceof KotlinClassMetadata.Class);
     KotlinClassMetadata.Class kClass = (KotlinClassMetadata.Class) metadata;
-    return new FoundKmClassSubject(codeInspector, getDexClass(), kClass.toKmClass());
+    return new FoundKmClassSubject(codeInspector, getDexProgramClass(), kClass.toKmClass());
   }
 
   @Override
@@ -364,11 +366,11 @@
         || metadata instanceof KotlinClassMetadata.MultiFileClassPart);
     if (metadata instanceof KotlinClassMetadata.FileFacade) {
       KotlinClassMetadata.FileFacade kFile = (KotlinClassMetadata.FileFacade) metadata;
-      return new FoundKmPackageSubject(codeInspector, getDexClass(), kFile.toKmPackage());
+      return new FoundKmPackageSubject(codeInspector, getDexProgramClass(), kFile.toKmPackage());
     } else {
       KotlinClassMetadata.MultiFileClassPart kPart =
           (KotlinClassMetadata.MultiFileClassPart) metadata;
-      return new FoundKmPackageSubject(codeInspector, getDexClass(), kPart.toKmPackage());
+      return new FoundKmPackageSubject(codeInspector, getDexProgramClass(), kPart.toKmPackage());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
index ae59c47..357c777 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
@@ -41,7 +41,7 @@
   }
 
   public boolean is(ClassSubject type) {
-    return dexType == type.getDexClass().type;
+    return dexType == type.getDexProgramClass().type;
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/analysis/ProtoApplicationStats.java b/src/test/java/com/android/tools/r8/utils/codeinspector/analysis/ProtoApplicationStats.java
index 28075e6..4d4c84b 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/analysis/ProtoApplicationStats.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/analysis/ProtoApplicationStats.java
@@ -147,7 +147,7 @@
   private void computeStats() {
     for (FoundClassSubject classSubject : inspector.allClasses()) {
       DexType originalType = classSubject.getOriginalDexType(dexItemFactory);
-      if (classSubject.getDexClass().isEnum()) {
+      if (classSubject.getDexProgramClass().isEnum()) {
         enumStats.enums.add(originalType);
       }
 
