diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
index eedfd24..0c816c4 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
@@ -269,9 +269,8 @@
   private void checkLambdaCount(CodeInspector inspector, int maxExpectedCount, String prefix) {
     List<String> found = new ArrayList<>();
     for (FoundClassSubject clazz : inspector.allClasses()) {
-      if (clazz.isSynthesizedJavaLambdaClass() &&
-          clazz.getOriginalName().startsWith(prefix)) {
-        found.add(clazz.getOriginalName());
+      if (clazz.isSynthesizedJavaLambdaClass() && clazz.getOriginalTypeName().startsWith(prefix)) {
+        found.add(clazz.getOriginalTypeName());
       }
     }
     assertEquals(StringUtils.lines(found), maxExpectedCount, found.size());
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 729f5e7..620dc0a 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -1955,7 +1955,7 @@
         Sets.difference(classUnion, classes2Set));
     Map<DexEncodedMethod, DexEncodedMethod> diffs = new IdentityHashMap<>();
     for (FoundClassSubject clazz1 : inspector1.allClasses()) {
-      ClassSubject clazz = inspector2.clazz(clazz1.getOriginalName());
+      ClassSubject clazz = inspector2.clazz(clazz1.getOriginalTypeName());
       assertTrue(clazz.isPresent());
       FoundClassSubject clazz2 = clazz.asFoundClassSubject();
       Set<String> methods1 =
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
index 8978240..019a579 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
@@ -72,8 +72,8 @@
       String type = DescriptorUtils.getJavaTypeFromBinaryName(getName(node));
       ClassSubject clazz = inspector.clazz(type);
       if (!clazz.isPresent()) {
-        if (!clazz.getOriginalName().startsWith("android.test")
-            && !clazz.getOriginalName().startsWith("junit")) {
+        if (!clazz.getOriginalTypeName().startsWith("android.test")
+            && !clazz.getOriginalTypeName().startsWith("junit")) {
           assert exemptionList.contains(type) || hasRemoved(node);
           assert exemptionList.contains(type) || getRemoved(node).isLessThanOrEqualTo(maxApiLevel);
           if (!hasRemoved(node)) {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingSubReferenceApiTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingSubReferenceApiTest.java
index 4f6282a..5be79b2 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingSubReferenceApiTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingSubReferenceApiTest.java
@@ -77,7 +77,7 @@
                 assertThat(sub.uniqueInstanceInitializer(), isAbsent());
                 assertEquals(1, sub.virtualMethods().size());
                 FoundMethodSubject callCallApi = sub.virtualMethods().get(0);
-                assertEquals("callCallApi", callCallApi.getOriginalName());
+                assertEquals("callCallApi", callCallApi.getOriginalMethodName());
                 assertThat(callCallApi, CodeMatchers.invokesMethodWithName("apiLevel22"));
               } else {
                 assertThat(base, isPresent());
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingTest.java
index 3f93300..616d872 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingTest.java
@@ -76,7 +76,7 @@
                 assertThat(sub.uniqueInstanceInitializer(), isAbsent());
                 assertEquals(1, sub.virtualMethods().size());
                 FoundMethodSubject callCallApi = sub.virtualMethods().get(0);
-                assertEquals("callCallApi", callCallApi.getOriginalName());
+                assertEquals("callCallApi", callCallApi.getOriginalMethodName());
                 assertThat(callCallApi, CodeMatchers.invokesMethodWithName("apiLevel22"));
               } else {
                 assertThat(base, isPresent());
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java
index f6a698a..33fe85c 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java
@@ -357,7 +357,7 @@
               .filter(
                   clazz ->
                       clazz
-                          .getOriginalName()
+                          .getOriginalTypeName()
                           .startsWith(
                               SyntheticItemsTestUtils.syntheticApiOutlineClassPrefix(
                                   method.getDeclaringClass())))
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingTestBase.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingTestBase.java
index 7720f9e..b70cb84 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingTestBase.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingTestBase.java
@@ -39,7 +39,7 @@
     assertTrue(classSubject.isPresent());
     FieldSubject[] classIds =
         classSubject.allFields().stream()
-            .filter(f -> f.getOriginalName(false).startsWith(ClassMerger.CLASS_ID_FIELD_PREFIX))
+            .filter(f -> f.getOriginalFieldName().startsWith(ClassMerger.CLASS_ID_FIELD_PREFIX))
             .toArray(FieldSubject[]::new);
     if (classIds.length == 1) {
       return classIds[0];
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontalstatic/InliningAfterStaticClassMergerTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontalstatic/InliningAfterStaticClassMergerTest.java
index c3cd8f4..00ab767 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontalstatic/InliningAfterStaticClassMergerTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontalstatic/InliningAfterStaticClassMergerTest.java
@@ -100,19 +100,19 @@
     // Check that StaticMergeCandidateB has been removed.
     List<FoundClassSubject> classes =
         inspector.allClasses().stream()
-            .filter(clazz -> clazz.getOriginalName().contains("StaticMergeCandidate"))
+            .filter(clazz -> clazz.getOriginalTypeName().contains("StaticMergeCandidate"))
             .collect(Collectors.toList());
     assertEquals(1, classes.size());
 
     FoundClassSubject clazz = classes.get(0);
-    assertEquals(StaticMergeCandidateA.class.getTypeName(), clazz.getOriginalName());
+    assertEquals(StaticMergeCandidateA.class.getTypeName(), clazz.getOriginalTypeName());
 
     // Check that StaticMergeCandidateB.m() has been inlined.
     assertEquals(0, clazz.allMethods().size());
 
     // Check that a static field has been synthesized in order to trigger class initialization.
     assertEquals(1, clazz.allStaticFields().size());
-    assertEquals("$r8$clinit", clazz.allStaticFields().get(0).getOriginalName());
+    assertEquals("$r8$clinit", clazz.allStaticFields().get(0).getOriginalFieldName());
 
     // Check that the test class only has a main method.
     ClassSubject classSubject = inspector.clazz(TestClass.class);
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontalstatic/StaticClassMergerTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontalstatic/StaticClassMergerTest.java
index 77d2e17..dd1000d 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontalstatic/StaticClassMergerTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontalstatic/StaticClassMergerTest.java
@@ -89,7 +89,7 @@
               // Check that one of the two static merge candidates has been removed
               List<FoundClassSubject> classes =
                   inspector.allClasses().stream()
-                      .filter(clazz -> clazz.getOriginalName().contains("StaticMergeCandidate"))
+                      .filter(clazz -> clazz.getOriginalTypeName().contains("StaticMergeCandidate"))
                       .collect(Collectors.toList());
               assertEquals(1, classes.size());
 
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
index c5c75a8..0eba6d4 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
@@ -1203,7 +1203,7 @@
 
     // Check that all classes in [preservedClassNames] are in fact preserved.
     for (FoundClassSubject classSubject : inputInspector.allClasses()) {
-      String className = classSubject.getOriginalName();
+      String className = classSubject.getOriginalTypeName();
       boolean shouldBePresent = preservedClassNames.test(className);
       assertEquals(
           "Class " + className + " should be " + (shouldBePresent ? "present" : "absent"),
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergingWithMissingTypeArgsSubstitutionTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergingWithMissingTypeArgsSubstitutionTest.java
index d79b35a..966addb 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergingWithMissingTypeArgsSubstitutionTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergingWithMissingTypeArgsSubstitutionTest.java
@@ -80,7 +80,7 @@
                           method.isFinal()
                               && method.isVirtual()
                               && !method.isSynthetic()
-                              && method.getOriginalName(false).equals("foo"));
+                              && method.getOriginalMethodName().equals("foo"));
               assertThat(fooMovedFromB, isPresentAndRenamed());
               assertEquals(
                   "(Ljava/lang/Object;)Ljava/lang/Object;",
@@ -92,7 +92,7 @@
                           method.isFinal()
                               && method.isVirtual()
                               && method.isSynthetic()
-                              && method.getOriginalName(false).equals("foo"));
+                              && method.getOriginalMethodName().equals("foo"));
               if (enableBridgeAnalysis) {
                 assertThat(fooBridge, isAbsent());
               } else {
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergingWithNonVisibleAnnotationTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergingWithNonVisibleAnnotationTest.java
index 075483e..5cbf8ad 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergingWithNonVisibleAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergingWithNonVisibleAnnotationTest.java
@@ -65,7 +65,7 @@
               MethodSubject foo =
                   sub.uniqueMethodThatMatches(
                       method ->
-                          method.getOriginalName(false).equals("foo") && !method.isSynthetic());
+                          method.getOriginalMethodName().equals("foo") && !method.isSynthetic());
               assertThat(foo, isPresent());
               AnnotationSubject privateMethodAnnotation =
                   foo.annotation(
diff --git a/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingBindsTest.java b/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingBindsTest.java
index 3f1fadc..3cfff3f 100644
--- a/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingBindsTest.java
+++ b/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingBindsTest.java
@@ -83,7 +83,7 @@
     assertEquals(
         expectedClasses.build(),
         inspector.allClasses().stream()
-            .map(FoundClassSubject::getOriginalName)
+            .map(FoundClassSubject::getOriginalTypeName)
             .filter(name -> !name.contains("_Factory"))
             .collect(Collectors.toSet()));
   }
diff --git a/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingProvidesTest.java b/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingProvidesTest.java
index f0c1349..8dae82c 100644
--- a/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingProvidesTest.java
+++ b/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingProvidesTest.java
@@ -63,7 +63,7 @@
     assertEquals(
         expectedClasses.build(),
         inspector.allClasses().stream()
-            .map(FoundClassSubject::getOriginalName)
+            .map(FoundClassSubject::getOriginalTypeName)
             .filter(name -> !name.contains("Factory"))
             .collect(Collectors.toSet()));
   }
diff --git a/src/test/java/com/android/tools/r8/debuginfo/DexPcWithDebugInfoForOverloadedMethodsTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/DexPcWithDebugInfoForOverloadedMethodsTestRunner.java
index 3e19580..b37e47d 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/DexPcWithDebugInfoForOverloadedMethodsTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/DexPcWithDebugInfoForOverloadedMethodsTestRunner.java
@@ -118,10 +118,10 @@
     assertThat(clazz, isPresent());
     assertEquals(3, clazz.allMethods().size());
     for (FoundMethodSubject method : clazz.allMethods()) {
-      if (method.getOriginalName().equals("main")) {
+      if (method.getOriginalMethodName().equals("main")) {
         assertNull(method.getMethod().getCode().asDexCode().getDebugInfo());
       } else {
-        assertEquals("overloaded", method.getOriginalName());
+        assertEquals("overloaded", method.getOriginalMethodName());
         assertNotNull(method.getMethod().getCode().asDexCode().getDebugInfo());
       }
     }
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugarInstanceLambdaWithReadsTest.java b/src/test/java/com/android/tools/r8/desugar/DesugarInstanceLambdaWithReadsTest.java
index 3d882a5..d6ebc46 100644
--- a/src/test/java/com/android/tools/r8/desugar/DesugarInstanceLambdaWithReadsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/DesugarInstanceLambdaWithReadsTest.java
@@ -65,7 +65,8 @@
     List<FoundMethodSubject> lambdaAccessorMethods =
         inspector
             .clazz(Main.class)
-            .allMethods(m -> m.getOriginalName().startsWith(R8_LAMBDA_ACCESSOR_METHOD_PREFIX));
+            .allMethods(
+                m -> m.getOriginalMethodName().startsWith(R8_LAMBDA_ACCESSOR_METHOD_PREFIX));
     assertEquals(0, lambdaAccessorMethods.size());
 
     // When generating DEX, R8 will inline the javac-generated lambda$ method into the synthesized
@@ -73,7 +74,8 @@
     List<FoundMethodSubject> lambdaImplementationMethods =
         inspector
             .clazz(Main.class)
-            .allMethods(m -> m.getOriginalName().startsWith(JAVAC_EXPECTED_LAMBDA_METHOD_PREFIX));
+            .allMethods(
+                m -> m.getOriginalMethodName().startsWith(JAVAC_EXPECTED_LAMBDA_METHOD_PREFIX));
     assertEquals(
         1 - BooleanUtils.intValue(parameters.isDexRuntime() && isR8),
         lambdaImplementationMethods.size());
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugarToClassFile.java b/src/test/java/com/android/tools/r8/desugar/DesugarToClassFile.java
index a71d340..18ae480 100644
--- a/src/test/java/com/android/tools/r8/desugar/DesugarToClassFile.java
+++ b/src/test/java/com/android/tools/r8/desugar/DesugarToClassFile.java
@@ -38,11 +38,11 @@
     if (canUseDefaultAndStaticInterfaceMethods) {
       assertTrue(
           inspector.allClasses().stream()
-              .noneMatch(subject -> subject.getOriginalName().endsWith("$-CC")));
+              .noneMatch(subject -> subject.getOriginalTypeName().endsWith("$-CC")));
     } else {
       assertTrue(
           inspector.allClasses().stream()
-              .anyMatch(subject -> subject.getOriginalName().endsWith("$-CC")));
+              .anyMatch(subject -> subject.getOriginalTypeName().endsWith("$-CC")));
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugaredLambdaImplementationInliningTest.java b/src/test/java/com/android/tools/r8/desugar/DesugaredLambdaImplementationInliningTest.java
index c89f08c..2041f10 100644
--- a/src/test/java/com/android/tools/r8/desugar/DesugaredLambdaImplementationInliningTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/DesugaredLambdaImplementationInliningTest.java
@@ -53,7 +53,7 @@
         .clazz(TestClass.class)
         .forAllMethods(
             fms -> {
-              if (fms.isStatic() && !fms.getOriginalName().equals("main")) {
+              if (fms.isStatic() && !fms.getOriginalMethodName().equals("main")) {
                 ++counter.i;
               }
             });
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java b/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
index ba3e8e6..9c9013b 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/BackportDuplicationTest.java
@@ -309,7 +309,7 @@
     inspector.forAllClasses(
         clazz -> {
           SyntheticNaming.verifyNotInternalSynthetic(clazz.getFinalReference());
-          if (!clazz.getOriginalName().equals(MiniAssert.class.getTypeName())) {
+          if (!clazz.getOriginalTypeName().equals(MiniAssert.class.getTypeName())) {
             clazz.forAllMethods(
                 method ->
                     assertTrue(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
index 387933f..d769ea6 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
@@ -104,7 +104,7 @@
         .forEach(
             clazz ->
                 assertThat(
-                    clazz.getOriginalName(),
+                    clazz.getOriginalTypeName(),
                     CoreMatchers.anyOf(startsWith("j$."), startsWith("java."))));
     if (parameters.getApiLevel().getLevel() < AndroidApiLevel.O.getLevel()) {
       assertThat(inspector.clazz("j$.time.Clock"), 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 2a185ea..b21dada 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
@@ -91,7 +91,7 @@
 
   private List<FoundClassSubject> getEmulatedInterfaces(CodeInspector inspector) {
     return inspector.allClasses().stream()
-        .filter(clazz -> clazz.getOriginalName().contains(getEmulateLibraryClassNameSuffix()))
+        .filter(clazz -> clazz.getOriginalTypeName().contains(getEmulateLibraryClassNameSuffix()))
         .collect(Collectors.toList());
   }
 
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 112fd70..9f389a4 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
@@ -97,11 +97,11 @@
         inspector.allClasses().stream()
             .filter(
                 c ->
-                    c.getOriginalName()
+                    c.getOriginalTypeName()
                             .startsWith(
                                 "com.android.tools.r8.desugar.desugaredlibrary.conversiontests")
-                        && !c.getOriginalName().contains("Executor")
-                        && !c.getOriginalName().contains("$-CC")
+                        && !c.getOriginalTypeName().contains("Executor")
+                        && !c.getOriginalTypeName().contains("$-CC")
                         && !c.getDexProgramClass().isInterface())
             .collect(toSingle());
     assertEquals(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
index 42fbe70..fb2fd96 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
@@ -51,11 +51,11 @@
   private void checkConversionGeneratedDex(CodeInspector inspector) {
     List<FoundClassSubject> conversionsClasses =
         inspector.allClasses().stream()
-            .filter(c -> c.getOriginalName().contains("Conversions"))
+            .filter(c -> c.getOriginalTypeName().contains("Conversions"))
             .filter(
                 c ->
-                    c.getOriginalName().contains(".util.")
-                        || c.getOriginalName().contains(".time."))
+                    c.getOriginalTypeName().contains(".util.")
+                        || c.getOriginalTypeName().contains(".time."))
             .collect(Collectors.toList());
     if (libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)) {
       assertEquals(5, conversionsClasses.size());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
index 59a6a1b..1d510ad 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
@@ -86,7 +86,9 @@
         libraryDesugaringSpecification == JDK8 ? duplicate ? 2 : 1 : duplicate ? 4 : 3;
     assertEquals(
         numForEachMethods,
-        clazz.virtualMethods().stream().filter(m -> m.getOriginalName().equals("forEach")).count());
+        clazz.virtualMethods().stream()
+            .filter(m -> m.getOriginalMethodName().equals("forEach"))
+            .count());
   }
 
   static class Executor {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIProgramTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIProgramTest.java
index 7c34edc..82f0436 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIProgramTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIProgramTest.java
@@ -69,7 +69,7 @@
     assertEquals(
         libraryDesugaringSpecification.hasJDollarFunction(parameters) ? 2 : 1,
         i.clazz(MyMap.class).virtualMethods().stream()
-            .filter(m -> m.getOriginalName().equals("forEach"))
+            .filter(m -> m.getOriginalMethodName().equals("forEach"))
             .count());
   }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/MoreFunctionConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/MoreFunctionConversionTest.java
index 427bf9c..ee4d2a6 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/MoreFunctionConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/MoreFunctionConversionTest.java
@@ -78,10 +78,10 @@
     int customLibSize = customLibInspector.allClasses().size();
     Set<String> foundClassSubjects = Sets.newHashSet();
     for (FoundClassSubject aClass : programInspector.allClasses()) {
-      foundClassSubjects.add(aClass.getOriginalName());
+      foundClassSubjects.add(aClass.getOriginalTypeName());
     }
     for (FoundClassSubject aClass : customLibInspector.allClasses()) {
-      foundClassSubjects.add(aClass.getOriginalName());
+      foundClassSubjects.add(aClass.getOriginalTypeName());
     }
     assertEquals(foundClassSubjects.size(), programSize + customLibSize);
   }
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestMethodInlinedTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestMethodInlinedTest.java
index 65df54e..48d4ca1 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestMethodInlinedTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestMethodInlinedTest.java
@@ -78,7 +78,7 @@
     int nbNotInlinedPvtCall = 0;
     for (FoundClassSubject subj : inspector.allClasses()) {
       assertTrue(
-          "nestPvtCallToInline should be inlined (from " + subj.getOriginalName() + ")",
+          "nestPvtCallToInline should be inlined (from " + subj.getOriginalTypeName() + ")",
           subj.allMethods().stream()
               .noneMatch(
                   method ->
diff --git a/src/test/java/com/android/tools/r8/graph/initializedclasses/InitializedClassesInInstanceMethodsTest.java b/src/test/java/com/android/tools/r8/graph/initializedclasses/InitializedClassesInInstanceMethodsTest.java
index aae9e11..eeb8627 100644
--- a/src/test/java/com/android/tools/r8/graph/initializedclasses/InitializedClassesInInstanceMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/graph/initializedclasses/InitializedClassesInInstanceMethodsTest.java
@@ -77,7 +77,7 @@
     assertEquals(
         numberOfExpectedAccessibilityBridges,
         outerClassSubject
-            .allMethods(method -> method.getOriginalName().contains("access$"))
+            .allMethods(method -> method.getOriginalMethodName().contains("access$"))
             .size());
     assertEquals(
         !enableInitializedClassesInInstanceMethodsAnalysis,
diff --git a/src/test/java/com/android/tools/r8/internal/proto/ProtoShrinkingTestBase.java b/src/test/java/com/android/tools/r8/internal/proto/ProtoShrinkingTestBase.java
index 8018e79..9bd5a74 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/ProtoShrinkingTestBase.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/ProtoShrinkingTestBase.java
@@ -137,7 +137,7 @@
         RawMessageInfoDecoder.createInfoIterator(
                 getInfoValueFromMessageInfoConstructionInvoke(invoke, references))
             .forEachRemaining(info::add);
-        result.put(classSubject.getOriginalName(), info);
+        result.put(classSubject.getOriginalTypeName(), info);
       }
     }
     return result;
diff --git a/src/test/java/com/android/tools/r8/ir/AssociativeIntTest.java b/src/test/java/com/android/tools/r8/ir/AssociativeIntTest.java
index 0bf911a..aec774e 100644
--- a/src/test/java/com/android/tools/r8/ir/AssociativeIntTest.java
+++ b/src/test/java/com/android/tools/r8/ir/AssociativeIntTest.java
@@ -180,9 +180,10 @@
     ClassSubject clazz = inspector.clazz(Main.class);
     for (FoundMethodSubject method :
         clazz.allMethods(m -> m.getParameters().size() > 0 && m.getParameter(0).is("int"))) {
-      int numberOfExpectedIntBinops = method.getOriginalName().contains("NotSimplified") ? 2 : 1;
+      int numberOfExpectedIntBinops =
+          method.getOriginalMethodName().contains("NotSimplified") ? 2 : 1;
       if (!enableConstantArgumentAnnotations) {
-        switch (method.getOriginalName()) {
+        switch (method.getOriginalMethodName()) {
           case "andDouble":
           case "orDoubleToConst":
           case "shlDoubleToConst":
@@ -195,7 +196,7 @@
         }
       }
       assertEquals(
-          method.getOriginalName(),
+          method.getOriginalMethodName(),
           numberOfExpectedIntBinops,
           method
               .streamInstructions()
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedPrimitiveNonNullTest.java b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedPrimitiveNonNullTest.java
index 8e2e53c..abf0ce3 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedPrimitiveNonNullTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/BoxedPrimitiveNonNullTest.java
@@ -46,7 +46,9 @@
 
   private void verifyNoBranch(CodeInspector codeInspector) {
     for (FoundMethodSubject nonMain :
-        codeInspector.clazz(TestClass.class).allMethods(m -> !m.getOriginalName().equals("main"))) {
+        codeInspector
+            .clazz(TestClass.class)
+            .allMethods(m -> !m.getOriginalMethodName().equals("main"))) {
       assertTrue(nonMain.streamInstructions().noneMatch(InstructionSubject::isIf));
     }
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/ReverseBoxingOperationsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/ReverseBoxingOperationsTest.java
index e19798b..c3968fe 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/ReverseBoxingOperationsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/boxedprimitives/ReverseBoxingOperationsTest.java
@@ -66,11 +66,11 @@
         24,
         codeInspector
             .clazz(Main.class)
-            .allMethods(m -> !m.getOriginalName().equals("main"))
+            .allMethods(m -> !m.getOriginalMethodName().equals("main"))
             .size());
     codeInspector
         .clazz(Main.class)
-        .allMethods(m -> !m.getOriginalName().equals("main"))
+        .allMethods(m -> !m.getOriginalMethodName().equals("main"))
         .forEach(
             m ->
                 assertTrue(
@@ -80,9 +80,9 @@
         .clazz(Main.class)
         .allMethods(
             m ->
-                !m.getOriginalName().equals("main")
-                    && (m.getOriginalName().contains("Unbox")
-                        || m.getOriginalName().contains("NonNull")))
+                !m.getOriginalMethodName().equals("main")
+                    && (m.getOriginalMethodName().contains("Unbox")
+                        || m.getOriginalMethodName().contains("NonNull")))
         .forEach(
             m ->
                 assertTrue(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ifs/DoubleDiamondCstTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ifs/DoubleDiamondCstTest.java
index 7c5ed88..5fbe95d 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/ifs/DoubleDiamondCstTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/ifs/DoubleDiamondCstTest.java
@@ -50,9 +50,9 @@
 
   private void inspect(CodeInspector inspector) {
     for (FoundMethodSubject method : inspector.clazz(Main.class).allMethods()) {
-      if (!method.getOriginalName().equals("main")) {
+      if (!method.getOriginalMethodName().equals("main")) {
         long count = method.streamInstructions().filter(InstructionSubject::isIf).count();
-        assertEquals(method.getOriginalName().contains("Double") ? 2 : 1, count);
+        assertEquals(method.getOriginalMethodName().contains("Double") ? 2 : 1, count);
       }
     }
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ifs/DoubleDiamondFloatTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ifs/DoubleDiamondFloatTest.java
index b433e5b..c1686e7 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/ifs/DoubleDiamondFloatTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/ifs/DoubleDiamondFloatTest.java
@@ -50,9 +50,9 @@
 
   private void inspect(CodeInspector inspector) {
     for (FoundMethodSubject method : inspector.clazz(Main.class).allMethods()) {
-      if (!method.getOriginalName().equals("main")) {
+      if (!method.getOriginalMethodName().equals("main")) {
         long count = method.streamInstructions().filter(InstructionSubject::isIf).count();
-        assertEquals(method.getOriginalName().contains("Double") ? 2 : 1, count);
+        assertEquals(method.getOriginalMethodName().contains("Double") ? 2 : 1, count);
       }
     }
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ifs/DoubleDiamondTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ifs/DoubleDiamondTest.java
index cf928e6..4f9994d 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/ifs/DoubleDiamondTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/ifs/DoubleDiamondTest.java
@@ -51,9 +51,9 @@
 
   private void inspect(CodeInspector inspector) {
     for (FoundMethodSubject method : inspector.clazz(Main.class).allMethods()) {
-      if (!method.getOriginalName().equals("main")) {
+      if (!method.getOriginalMethodName().equals("main")) {
         long count = method.streamInstructions().filter(InstructionSubject::isIf).count();
-        assertEquals(method.getOriginalName().contains("Double") ? 2 : 1, count);
+        assertEquals(method.getOriginalMethodName().contains("Double") ? 2 : 1, count);
       }
     }
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/loops/LoopWith0Iterations.java b/src/test/java/com/android/tools/r8/ir/optimize/loops/LoopWith0Iterations.java
index 384b89c..6374d0b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/loops/LoopWith0Iterations.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/loops/LoopWith0Iterations.java
@@ -51,7 +51,7 @@
   private void assertLoopRemoved(CodeInspector inspector) {
     inspector
         .clazz(Main.class)
-        .allMethods(m -> !m.getOriginalName().contains("Argument"))
+        .allMethods(m -> !m.getOriginalMethodName().contains("Argument"))
         .forEach(
             m ->
                 assertTrue(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringFormatTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringFormatTest.java
index fa21a9f..a860dfe 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringFormatTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringFormatTest.java
@@ -147,7 +147,7 @@
             .or(InstructionSubject::isFilledNewArray);
 
     for (MethodSubject method : mainClass.allMethods()) {
-      String methodName = method.getOriginalName();
+      String methodName = method.getOriginalMethodName();
       if (!methodName.contains("Should")) {
         continue;
       }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithNonNullParamCheckTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithNonNullParamCheckTest.java
index 9cd0bdc..c7729f4 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithNonNullParamCheckTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithNonNullParamCheckTest.java
@@ -105,8 +105,9 @@
     // Check that a throw instruction has been inserted into each of the testRewriteInvoke* methods.
     int found = 0;
     for (FoundMethodSubject methodSubject : testClassSubject.allMethods()) {
-      if (methodSubject.getOriginalName().startsWith("testRewriteInvoke")) {
-        boolean shouldHaveThrow = !methodSubject.getOriginalName().contains("NonNullArgument");
+      if (methodSubject.getOriginalMethodName().startsWith("testRewriteInvoke")) {
+        boolean shouldHaveThrow =
+            !methodSubject.getOriginalMethodName().contains("NonNullArgument");
         assertEquals(
             shouldHaveThrow,
             Streams.stream(methodSubject.iterateInstructions())
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithReceiverOptimizationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithReceiverOptimizationTest.java
index dd021a9..fbe1064 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithReceiverOptimizationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithReceiverOptimizationTest.java
@@ -92,7 +92,7 @@
     // methods.
     int found = 0;
     for (FoundMethodSubject methodSubject : testClassSubject.allMethods()) {
-      if (methodSubject.getOriginalName().startsWith("testRewriteToThrowNull")) {
+      if (methodSubject.getOriginalMethodName().startsWith("testRewriteToThrowNull")) {
         assertTrue(
             Streams.stream(methodSubject.iterateInstructions())
                 .anyMatch(InstructionSubject::isThrow));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/UninstantiatedAnnotatedArgumentsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/UninstantiatedAnnotatedArgumentsTest.java
index bc28fcb..e5c56c7 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/UninstantiatedAnnotatedArgumentsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/UninstantiatedAnnotatedArgumentsTest.java
@@ -135,7 +135,7 @@
   }
 
   private static int getPositionOfUnusedArgument(MethodSubject methodSubject) {
-    switch (methodSubject.getOriginalName(false)) {
+    switch (methodSubject.getOriginalMethodName()) {
       case "testRemoveStaticFromStart":
       case "testRemoveVirtualFromStart":
         return 0;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedAnnotatedArgumentsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedAnnotatedArgumentsTest.java
index 32e1403..764d4f8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedAnnotatedArgumentsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedAnnotatedArgumentsTest.java
@@ -124,7 +124,7 @@
   }
 
   private static int getPositionOfUnusedArgument(MethodSubject methodSubject) {
-    switch (methodSubject.getOriginalName(false)) {
+    switch (methodSubject.getOriginalMethodName()) {
       case "testRemoveStaticFromStart":
       case "testRemoveVirtualFromStart":
         return 0;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsIntTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsIntTest.java
index c1a0a21..9f0d500 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsIntTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsIntTest.java
@@ -82,7 +82,7 @@
     clazz.forAllMethods(
         method -> {
           Assert.assertTrue(
-              methodsThatWontBeOptimized.contains(method.getOriginalName())
+              methodsThatWontBeOptimized.contains(method.getOriginalMethodName())
                   || (method.getFinalSignature().parameters.length == 1
                       && method.getFinalSignature().parameters[0].equals("int")));
         });
diff --git a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
index 03f1156..575781e 100644
--- a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
@@ -142,9 +142,10 @@
   protected FieldSubject checkFieldIsKept(
       ClassSubject classSubject, String fieldType, String fieldName) {
     // Field must exist in the input.
-    checkFieldPresenceInInput(classSubject.getOriginalName(), fieldType, fieldName, true);
+    checkFieldPresenceInInput(classSubject.getOriginalTypeName(), fieldType, fieldName, true);
     FieldSubject fieldSubject = classSubject.field(fieldType, fieldName);
-    assertTrue("No field " + fieldName + " in " + classSubject.getOriginalName(),
+    assertTrue(
+        "No field " + fieldName + " in " + classSubject.getOriginalTypeName(),
         fieldSubject.isPresent());
     return fieldSubject;
   }
@@ -157,20 +158,20 @@
 
   protected void checkFieldIsAbsent(ClassSubject classSubject, String fieldType, String fieldName) {
     // Field must NOT exist in the input.
-    checkFieldPresenceInInput(classSubject.getOriginalName(), fieldType, fieldName, false);
+    checkFieldPresenceInInput(classSubject.getOriginalTypeName(), fieldType, fieldName, false);
     FieldSubject fieldSubject = classSubject.field(fieldType, fieldName);
     assertNotNull(fieldSubject);
     assertFalse(fieldSubject.isPresent());
   }
 
   protected void checkMethodIsAbsent(ClassSubject classSubject, MethodSignature methodSignature) {
-    checkMethodPresenceInInput(classSubject.getOriginalName(), methodSignature, false);
+    checkMethodPresenceInInput(classSubject.getOriginalTypeName(), methodSignature, false);
     checkMethodPresenceInOutput(classSubject, methodSignature, false);
   }
 
   protected MethodSubject checkMethodIsKept(
       ClassSubject classSubject, MethodSignature methodSignature) {
-    checkMethodPresenceInInput(classSubject.getOriginalName(), methodSignature, true);
+    checkMethodPresenceInInput(classSubject.getOriginalTypeName(), methodSignature, true);
     return checkMethodIsKeptOrRemoved(classSubject, methodSignature, true);
   }
 
@@ -181,13 +182,13 @@
   }
 
   protected void checkMethodIsRemoved(ClassSubject classSubject, MethodSignature methodSignature) {
-    checkMethodPresenceInInput(classSubject.getOriginalName(), methodSignature, true);
+    checkMethodPresenceInInput(classSubject.getOriginalTypeName(), methodSignature, true);
     checkMethodIsKeptOrRemoved(classSubject, methodSignature, false);
   }
 
   protected MethodSubject checkMethodIsKeptOrRemoved(
       ClassSubject classSubject, MethodSignature methodSignature, boolean isPresent) {
-    checkMethodPresenceInInput(classSubject.getOriginalName(), methodSignature, true);
+    checkMethodPresenceInInput(classSubject.getOriginalTypeName(), methodSignature, true);
     return checkMethodPresenceInOutput(classSubject, methodSignature, isPresent);
   }
 
diff --git a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
index 29f2c2d..a7deb97 100644
--- a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
@@ -62,7 +62,7 @@
               ClassSubject clazz = checkClassIsKept(inspector, ex1.getClassName());
 
               // Verify forMakeAndModel(...) is present in the input.
-              checkMethodPresenceInInput(clazz.getOriginalName(), testMethodSignature, true);
+              checkMethodPresenceInInput(clazz.getOriginalTypeName(), testMethodSignature, true);
 
               // Find forMakeAndModel(...) after parameter removal.
               MethodSubject testMethod =
diff --git a/src/test/java/com/android/tools/r8/kotlin/lambda/b159688129/LambdaSplitByCodeCorrectnessTest.java b/src/test/java/com/android/tools/r8/kotlin/lambda/b159688129/LambdaSplitByCodeCorrectnessTest.java
index 35fe619..2724d76 100644
--- a/src/test/java/com/android/tools/r8/kotlin/lambda/b159688129/LambdaSplitByCodeCorrectnessTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/lambda/b159688129/LambdaSplitByCodeCorrectnessTest.java
@@ -119,7 +119,7 @@
                           method.isVirtual()
                               && !method.isSynthetic()
                               && method
-                                  .getOriginalName(false)
+                                  .getOriginalMethodName()
                                   .equals(isKotlinOld ? "invoke$1" : "invoke"));
               assertThat(virtualMethodSubject, isPresent());
 
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java b/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
index 22c3669..fb0f2fa 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
@@ -65,7 +65,7 @@
         originalInspector.allClasses().stream()
             .sorted(Comparator.comparing(FoundClassSubject::getFinalName))
             .collect(Collectors.toList())) {
-      ClassSubject r8Clazz = rewrittenInspector.clazz(clazzSubject.getOriginalName());
+      ClassSubject r8Clazz = rewrittenInspector.clazz(clazzSubject.getOriginalTypeName());
       assertThat(r8Clazz, isPresent());
       KotlinClassMetadata originalMetadata = clazzSubject.getKotlinClassMetadata();
       KotlinClassMetadata rewrittenMetadata = r8Clazz.getKotlinClassMetadata();
@@ -123,7 +123,7 @@
   public void assertEqualDeserializedMetadata(
       CodeInspector inspector, CodeInspector otherInspector) {
     for (FoundClassSubject clazzSubject : otherInspector.allClasses()) {
-      ClassSubject r8Clazz = inspector.clazz(clazzSubject.getOriginalName());
+      ClassSubject r8Clazz = inspector.clazz(clazzSubject.getOriginalTypeName());
       assertThat(r8Clazz, isPresent());
       KotlinClassMetadata originalMetadata = clazzSubject.getKotlinClassMetadata();
       KotlinClassMetadata rewrittenMetadata = r8Clazz.getKotlinClassMetadata();
@@ -148,7 +148,7 @@
 
   public void assertEqualMetadata(CodeInspector inspector, CodeInspector otherInspector) {
     for (FoundClassSubject clazzSubject : otherInspector.allClasses()) {
-      ClassSubject r8Clazz = inspector.clazz(clazzSubject.getOriginalName());
+      ClassSubject r8Clazz = inspector.clazz(clazzSubject.getOriginalTypeName());
       assertThat(r8Clazz, isPresent());
       KotlinClassMetadata originalMetadata = clazzSubject.getKotlinClassMetadata();
       KotlinClassMetadata rewrittenMetadata = r8Clazz.getKotlinClassMetadata();
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInNestedClassTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInNestedClassTest.java
index 1716b58..1b5ed13 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInNestedClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInNestedClassTest.java
@@ -130,7 +130,7 @@
             nestedClassDescriptor -> {
               ClassSubject nestedClass =
                   inspector.clazz(descriptorToJavaType(nestedClassDescriptor));
-              if (nestedClass.getOriginalName().contains("Inner")) {
+              if (nestedClass.getOriginalTypeName().contains("Inner")) {
                 assertThat(nestedClass, isPresentAndNotRenamed());
               } else {
                 assertThat(nestedClass, isPresentAndRenamed());
diff --git a/src/test/java/com/android/tools/r8/naming/KotlinIntrinsicsIdentifierTest.java b/src/test/java/com/android/tools/r8/naming/KotlinIntrinsicsIdentifierTest.java
index 1191b8a..7378a90 100644
--- a/src/test/java/com/android/tools/r8/naming/KotlinIntrinsicsIdentifierTest.java
+++ b/src/test/java/com/android/tools/r8/naming/KotlinIntrinsicsIdentifierTest.java
@@ -133,9 +133,10 @@
               .collect(Collectors.toList()));
       assertThat(invokedMethodSubject, isPresent());
       assertEquals(minification, invokedMethodSubject.isRenamed());
-      if (invokedMethodSubject.getOriginalName().startsWith("check")
-          && invokedMethodSubject.getOriginalName().endsWith("Null")
-          && invokedMethodHolderSubject.getOriginalDescriptor()
+      if (invokedMethodSubject.getOriginalMethodName().startsWith("check")
+          && invokedMethodSubject.getOriginalMethodName().endsWith("Null")
+          && invokedMethodHolderSubject
+              .getOriginalDescriptor()
               .contains("kotlin/jvm/internal/Intrinsics")) {
         metKotlinIntrinsicsNullChecks = true;
       }
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingAfterVerticalMergingMethodTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingAfterVerticalMergingMethodTest.java
index c1a3053..c5817de 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingAfterVerticalMergingMethodTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingAfterVerticalMergingMethodTest.java
@@ -119,7 +119,8 @@
               assertEquals(
                   1, methods.stream().filter(m -> m.getFinalName().contains("main")).count());
               assertEquals(
-                  1, methods.stream().filter(m -> m.getOriginalName().contains("foo")).count());
+                  1,
+                  methods.stream().filter(m -> m.getOriginalMethodName().contains("foo")).count());
             });
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingOnLibraryPathTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingOnLibraryPathTest.java
index 25dbaa3..7e35321 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingOnLibraryPathTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingOnLibraryPathTest.java
@@ -46,7 +46,7 @@
               FoundClassSubject foundClassSubject = clazz.asFoundClassSubject();
               assertEquals(
                   typeName(LibraryClass.class),
-                  foundClassSubject.getSuperClass().getOriginalName());
+                  foundClassSubject.getSuperClass().getOriginalTypeName());
             })
         .addRunClasspathClasses(LibraryClass.class)
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/InvokeSpecialToVirtualMethodProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/InvokeSpecialToVirtualMethodProfileRewritingTest.java
index a1c6307..0b423ed 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/InvokeSpecialToVirtualMethodProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/InvokeSpecialToVirtualMethodProfileRewritingTest.java
@@ -115,7 +115,7 @@
     List<FoundMethodSubject> methods =
         mainClassSubject.allMethods(
             m -> {
-              String originalName = m.getOriginalName();
+              String originalName = m.getOriginalMethodName();
               return originalName.equals("m")
                   || originalName.equals(syntheticInvokeSpecialMethod(mMethod).getMethodName());
             });
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/MovedPrivateInterfaceMethodProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/MovedPrivateInterfaceMethodProfileRewritingTest.java
index 82edb64..632fc0b 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/MovedPrivateInterfaceMethodProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/MovedPrivateInterfaceMethodProfileRewritingTest.java
@@ -132,7 +132,6 @@
           inspector.clazz(SyntheticItemsTestUtils.syntheticCompanionClass(I.class));
       assertThat(companionClassSubject, isPresent());
 
-      String mMethodOnI = typeName(I.class) + ".m";
       String mMethodNameOnICC =
           SyntheticItemsTestUtils.syntheticPrivateInterfaceMethodAsCompanionMethod(
                   I.class.getDeclaredMethod("m"))
@@ -140,8 +139,8 @@
       MethodSubject privateInterfaceMethodSubject =
           companionClassSubject.uniqueMethodThatMatches(
               m -> {
-                String originalName = m.getOriginalName();
-                return originalName.equals(mMethodOnI) || originalName.equals(mMethodNameOnICC);
+                String originalName = m.getOriginalMethodName();
+                return originalName.equals("m") || originalName.equals(mMethodNameOnICC);
               });
       assertThat(privateInterfaceMethodSubject, isPresent());
 
diff --git a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
index 535da71..523be55 100644
--- a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
+++ b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
@@ -259,11 +259,13 @@
     assertThat(svOnA, isPresent());
     ClassSubject classB = inspector.clazz(B.class);
     assertThat(classB, isPresent());
-    MethodSubject mfOnB = classB.method("void", "mf", ImmutableList.of(classA.getOriginalName()));
+    MethodSubject mfOnB =
+        classB.method("void", "mf", ImmutableList.of(classA.getOriginalTypeName()));
     assertThat(mfOnB, isPresent());
     MethodSubject msfOnB = classB.method("void", "msf", ImmutableList.of());
     assertThat(msfOnB, isPresent());
-    MethodSubject mvOnB = classB.method("void", "mv", ImmutableList.of(classA.getOriginalName()));
+    MethodSubject mvOnB =
+        classB.method("void", "mv", ImmutableList.of(classA.getOriginalTypeName()));
     assertThat(mvOnB, isPresent());
     MethodSubject msvOnB = classB.method("void", "msv", ImmutableList.of());
     assertThat(msvOnB, isPresent());
diff --git a/src/test/java/com/android/tools/r8/regress/b116575775/B116575775.java b/src/test/java/com/android/tools/r8/regress/b116575775/B116575775.java
index 1dc280c..06125d8 100644
--- a/src/test/java/com/android/tools/r8/regress/b116575775/B116575775.java
+++ b/src/test/java/com/android/tools/r8/regress/b116575775/B116575775.java
@@ -22,9 +22,7 @@
                 readClasses(clazz),
                 keepMainProguardConfiguration(clazz)));
     // Ensure toBeInlined is inlined, and only main remains.
-    inspector
-        .clazz(clazz)
-        .forAllMethods(m -> assertEquals(m.getOriginalName(), "main"));
+    inspector.clazz(clazz).forAllMethods(m -> assertEquals(m.getOriginalMethodName(), "main"));
   }
 
   @Test
@@ -53,7 +51,10 @@
     JasminBuilder builder = new JasminBuilder();
     JasminBuilder.ClassBuilder clazz = builder.addClass("Test");
 
-    clazz.addStaticMethod("toBeInlined", ImmutableList.of(), "V",
+    clazz.addStaticMethod(
+        "toBeInlined",
+        ImmutableList.of(),
+        "V",
         ".limit stack 1",
         "LabelTryStart:",
         "  new java/lang/Object",
@@ -65,11 +66,12 @@
         "  goto LabelRet",
         "LabelRet:",
         "  return",
-        ".catch java/lang/IllegalArgumentException from LabelTryStart to LabelTryEnd using LabelCatch",
+        ".catch java/lang/IllegalArgumentException from LabelTryStart to LabelTryEnd using"
+            + " LabelCatch",
         ".catch java/lang/ArithmeticException from LabelTryStart to LabelTryEnd using LabelCatch",
         ".catch java/lang/ArithmeticException from LabelTryStart to LabelTryEnd using LabelCatch",
-        ".catch java/lang/IllegalArgumentException from LabelTryStart to LabelTryEnd using LabelCatch"
-    );
+        ".catch java/lang/IllegalArgumentException from LabelTryStart to LabelTryEnd using"
+            + " LabelCatch");
 
     clazz.addMainMethod(
         ".limit stack 1",
@@ -83,9 +85,11 @@
         "LabelRet:",
         "  return",
         ".catch java/lang/ArithmeticException from LabelTryStart to LabelTryEnd using LabelCatch",
-        ".catch java/lang/IllegalArgumentException from LabelTryStart to LabelTryEnd using LabelCatch",
+        ".catch java/lang/IllegalArgumentException from LabelTryStart to LabelTryEnd using"
+            + " LabelCatch",
         ".catch java/lang/ArithmeticException from LabelTryStart to LabelTryEnd using LabelCatch",
-        ".catch java/lang/IllegalArgumentException from LabelTryStart to LabelTryEnd using LabelCatch");
+        ".catch java/lang/IllegalArgumentException from LabelTryStart to LabelTryEnd using"
+            + " LabelCatch");
 
     assertEquals(0, runOnJavaRaw("Test", builder.buildClasses(), ImmutableList.of()).exitCode);
 
@@ -95,9 +99,7 @@
                 buildAndroidApp(builder.buildClasses()),
                 keepMainProguardConfiguration("Test")));
     // Ensure toBeInlined is inlined, and only main remains.
-    inspector
-        .clazz("Test")
-        .forAllMethods(m -> assertEquals(m.getOriginalName(), "main"));
+    inspector.clazz("Test").forAllMethods(m -> assertEquals(m.getOriginalMethodName(), "main"));
   }
 }
 
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageClassesWithDontObfuscateTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageClassesWithDontObfuscateTest.java
index e2cd494..2a8d28a 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageClassesWithDontObfuscateTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageClassesWithDontObfuscateTest.java
@@ -52,7 +52,7 @@
                   DescriptorUtils.getPackageBinaryNameFromJavaType(
                       clazz.getFinalName().substring(DESTINATION_PACKAGE.length() + 1));
               String originalPackage =
-                  DescriptorUtils.getPackageBinaryNameFromJavaType(clazz.getOriginalName());
+                  DescriptorUtils.getPackageBinaryNameFromJavaType(clazz.getOriginalTypeName());
               assertEquals(relocatedPackageSuffix, originalPackage);
             });
   }
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithSyntheticItemTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithSyntheticItemTest.java
index c33e05e..d4b5b7f 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageWithSyntheticItemTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithSyntheticItemTest.java
@@ -66,7 +66,7 @@
               assertEquals(1, classesStartingWithfoo.size());
               String expectedOriginalNamePrefix = typeName(A.class) + "$$ExternalSyntheticLambda0";
               assertThat(
-                  classesStartingWithfoo.get(0).getOriginalName(),
+                  classesStartingWithfoo.get(0).getOriginalTypeName(),
                   containsString(expectedOriginalNamePrefix));
             });
   }
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationKotlinTestBase.java b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationKotlinTestBase.java
index cbfb646..b711499 100644
--- a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationKotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationKotlinTestBase.java
@@ -168,7 +168,7 @@
 
   protected void checkAssertionCodeRemoved(ClassSubject subject, boolean isR8) {
     assertThat(subject, isPresent());
-    if (subject.getOriginalName().equals("kotlin._Assertions")) {
+    if (subject.getOriginalTypeName().equals("kotlin._Assertions")) {
       assert !kotlinStdlibAsLibrary;
       // With R8 the static-put of the kotlin._Assertions.INSTANCE field is removed as well,
       // as is not used.
@@ -201,7 +201,7 @@
 
   protected void checkAssertionCodeEnabled(ClassSubject subject, boolean isR8) {
     assertThat(subject, isPresent());
-    if (subject.getOriginalName().equals("kotlin._Assertions")) {
+    if (subject.getOriginalTypeName().equals("kotlin._Assertions")) {
       assert !kotlinStdlibAsLibrary;
       // With R8 the static-put of the kotlin._Assertions.INSTANCE field is removed as is not used.
       assertEquals(
diff --git a/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java b/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java
index 238234a..5519374 100644
--- a/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java
@@ -243,7 +243,7 @@
           assertEquals(1, emptyClassSubject.allStaticFields().size());
 
           FieldSubject clinitFieldSubject = emptyClassSubject.allStaticFields().get(0);
-          assertEquals("$r8$clinit", clinitFieldSubject.getOriginalName());
+          assertEquals("$r8$clinit", clinitFieldSubject.getOriginalFieldName());
 
           ClassSubject mainClassSubject = inspector.clazz(main.name);
           assertThat(mainClassSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
index c0211ef..8df062f 100644
--- a/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
@@ -153,11 +153,12 @@
               List<FoundMethodSubject> methods =
                   inspector.clazz(CLASS_WITH_ANNOTATED_METHOD).allMethods();
               assertEquals(
-                  1, methods.stream().filter(m -> m.getOriginalName().equals("<init>")).count());
+                  1,
+                  methods.stream().filter(m -> m.getOriginalMethodName().equals("<init>")).count());
               assertEquals(
                   1,
                   methods.stream()
-                      .filter(m -> m.getOriginalName().equals(ANNOTATED_METHOD))
+                      .filter(m -> m.getOriginalMethodName().equals(ANNOTATED_METHOD))
                       .count());
               assertEquals(2, methods.size());
             });
@@ -190,11 +191,12 @@
               List<FoundMethodSubject> methods =
                   inspector.clazz(CLASS_WITH_ANNOTATED_METHOD).allMethods();
               assertEquals(
-                  1, methods.stream().filter(m -> m.getOriginalName().equals("<init>")).count());
+                  1,
+                  methods.stream().filter(m -> m.getOriginalMethodName().equals("<init>")).count());
               assertEquals(
                   1,
                   methods.stream()
-                      .filter(m -> m.getOriginalName().equals(ANNOTATED_METHOD))
+                      .filter(m -> m.getOriginalMethodName().equals(ANNOTATED_METHOD))
                       .count());
               assertEquals(2, methods.size());
             });
@@ -312,11 +314,11 @@
     Set<String> referenceClasses =
         new TreeSet<>(
             referenceResult.codeInspector().allClasses().stream()
-                .map(FoundClassSubject::getOriginalName)
+                .map(FoundClassSubject::getOriginalTypeName)
                 .collect(Collectors.toSet()));
     Set<String> conditionalClasses =
         conditionalResult.codeInspector().allClasses().stream()
-            .map(FoundClassSubject::getOriginalName)
+            .map(FoundClassSubject::getOriginalTypeName)
             .collect(Collectors.toSet());
     Set<String> notInReference =
         new TreeSet<>(Sets.difference(conditionalClasses, referenceClasses));
diff --git a/src/test/java/com/android/tools/r8/shaking/b113138046/NativeMethodTest.java b/src/test/java/com/android/tools/r8/shaking/b113138046/NativeMethodTest.java
index 41ea956..49c7549 100644
--- a/src/test/java/com/android/tools/r8/shaking/b113138046/NativeMethodTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/b113138046/NativeMethodTest.java
@@ -54,7 +54,7 @@
     CodeInspector inspector = compileResult.inspector();
     boolean innerFound = false;
     for (ClassSubject clazz : inspector.allClasses()) {
-      innerFound = clazz.getOriginalName().endsWith("Inner");
+      innerFound = clazz.getOriginalTypeName().endsWith("Inner");
       if (!innerFound) {
         continue;
       }
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
index c5fc066..1d62f64 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
@@ -132,9 +132,8 @@
     assert programClasses.contains(mainClass);
     assertEquals(programClasses.size(), inspector.allClasses().size());
     checkPresentWithDefaultConstructor(inspector.clazz(mainClass));
-    inspector.allClasses()
-        .stream()
-        .filter(subject -> !subject.getOriginalName().equals(mainClass.getCanonicalName()))
+    inspector.allClasses().stream()
+        .filter(subject -> !subject.getOriginalTypeName().equals(mainClass.getCanonicalName()))
         .forEach(this::checkPresentWithoutDefaultConstructor);
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/modifiers/SyntheticAndBridgeModifiersTest.java b/src/test/java/com/android/tools/r8/shaking/modifiers/SyntheticAndBridgeModifiersTest.java
index 1f4f912..e444fdd 100644
--- a/src/test/java/com/android/tools/r8/shaking/modifiers/SyntheticAndBridgeModifiersTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/modifiers/SyntheticAndBridgeModifiersTest.java
@@ -52,10 +52,8 @@
   }
 
   private long methodsWithNameStartingWith(ClassSubject clazz, String prefix) {
-    return clazz
-        .allMethods()
-        .stream()
-        .filter(method -> method.getOriginalName().startsWith(prefix))
+    return clazz.allMethods().stream()
+        .filter(method -> method.getOriginalMethodName().startsWith(prefix))
         .count();
   }
 
diff --git a/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java b/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
index 3c11f22..2f41828 100644
--- a/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
+++ b/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
@@ -262,7 +262,7 @@
             bClassSubject.uniqueMethodThatMatches(
                 method ->
                     method
-                        .getOriginalName()
+                        .getOriginalMethodName()
                         .startsWith(LambdaClass.R8_LAMBDA_ACCESSOR_METHOD_PREFIX));
         assertThat(syntheticLambdaAccessorMethod, isPresent());
 
diff --git a/src/test/java/com/android/tools/r8/utils/AppComparator.java b/src/test/java/com/android/tools/r8/utils/AppComparator.java
index 9dcec97..32dcada 100644
--- a/src/test/java/com/android/tools/r8/utils/AppComparator.java
+++ b/src/test/java/com/android/tools/r8/utils/AppComparator.java
@@ -66,39 +66,43 @@
               && encodedMethod.getReference().getArity() == 0;
         };
 
-    inspect1.forAllClasses(clazz1 -> {
-      clazz1.forAllMethods(method1 -> {
-        if (methodTester.test(method1.getMethod())) {
-          ClassSubject clazz2 = inspect2.clazz(clazz1.getOriginalName());
-          if (!clazz2.isPresent()) {
-            String classNotFound =
-                String.format("Class %s not found in app2", clazz1.getOriginalName());
-            if (allowMissingClassInApp2) {
-              System.out.println(classNotFound);
-              return;
-            }
-            assertThat(classNotFound, clazz2, isPresent());
-          }
-          MethodSubject method2 = clazz2.method(method1.getOriginalSignature());
-          if (!method2.isPresent()) {
-            method2 = clazz2.method(method1.getFinalSignature());
-          }
-          if (!method2.isPresent()) {
-            assertThat(String.format("Method %s not found in app2", method1.getFinalSignature()),
-                method2, isPresent());
-          }
-          if (method1.getMethod().shouldNotHaveCode()) {
-            assertTrue(method2.getMethod().shouldNotHaveCode());
-            return;
-          }
-          if (!identicalCode(method1, method2)) {
-            System.out.println("Found different method body: ");
-            System.out.println(method1.getMethod().codeToString());
-            System.out.println(method2.getMethod().codeToString());
-          }
-        }
-      });
-    });
+    inspect1.forAllClasses(
+        clazz1 -> {
+          clazz1.forAllMethods(
+              method1 -> {
+                if (methodTester.test(method1.getMethod())) {
+                  ClassSubject clazz2 = inspect2.clazz(clazz1.getOriginalTypeName());
+                  if (!clazz2.isPresent()) {
+                    String classNotFound =
+                        String.format("Class %s not found in app2", clazz1.getOriginalTypeName());
+                    if (allowMissingClassInApp2) {
+                      System.out.println(classNotFound);
+                      return;
+                    }
+                    assertThat(classNotFound, clazz2, isPresent());
+                  }
+                  MethodSubject method2 = clazz2.method(method1.getOriginalSignature());
+                  if (!method2.isPresent()) {
+                    method2 = clazz2.method(method1.getFinalSignature());
+                  }
+                  if (!method2.isPresent()) {
+                    assertThat(
+                        String.format("Method %s not found in app2", method1.getFinalSignature()),
+                        method2,
+                        isPresent());
+                  }
+                  if (method1.getMethod().shouldNotHaveCode()) {
+                    assertTrue(method2.getMethod().shouldNotHaveCode());
+                    return;
+                  }
+                  if (!identicalCode(method1, method2)) {
+                    System.out.println("Found different method body: ");
+                    System.out.println(method1.getMethod().codeToString());
+                    System.out.println(method2.getMethod().codeToString());
+                  }
+                }
+              });
+        });
   }
 
   @Ignore("Comment out this to run locally.")
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 39e3174..b515144 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
@@ -140,7 +140,7 @@
   }
 
   @Override
-  public String getOriginalName() {
+  public String getOriginalTypeName() {
     return reference.getTypeName();
   }
 
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java
index 2c38d35..0f3f678 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java
@@ -20,8 +20,6 @@
 
   public abstract AccessFlags<?> getAccessFlags();
 
-  public abstract String getOriginalName();
-
   public final boolean isFinal() {
     return getAccessFlags().isFinal();
   }
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 99dd879..8833c9f 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
@@ -213,13 +213,12 @@
 
   public abstract DexProgramClass getDexProgramClass();
 
-  @Override
-  public abstract String getOriginalName();
-
   public abstract String getOriginalDescriptor();
 
   public abstract String getOriginalBinaryName();
 
+  public abstract String getOriginalTypeName();
+
   public abstract ClassReference getOriginalReference();
 
   public abstract ClassReference getFinalReference();
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java
index 9b9d373..04a5c9c 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java
@@ -24,6 +24,10 @@
   @Override
   public abstract boolean isRenamed();
 
+  public String getOriginalFieldName() {
+    return getOriginalName();
+  }
+
   public abstract String getOriginalSignatureAttribute();
 
   @Override
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 e7146dc..67a41c1 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
@@ -153,7 +153,7 @@
   public MethodSubject uniqueMethodWithOriginalName(String name) {
     MethodSubject methodSubject = null;
     for (FoundMethodSubject candidate : allMethods()) {
-      if (candidate.getOriginalName(false).equals(name)) {
+      if (candidate.getOriginalMethodName().equals(name)) {
         assert methodSubject == null;
         methodSubject = candidate;
       }
@@ -393,7 +393,7 @@
   }
 
   @Override
-  public String getOriginalName() {
+  public String getOriginalTypeName() {
     if (getNaming() != null) {
       return getNaming().originalName;
     } else {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
index c9aeccb..45944b2 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
@@ -147,7 +147,7 @@
     DexField originalDexField = getOriginalDexField(codeInspector.getFactory());
     return Reference.field(
         Reference.classFromDescriptor(originalDexField.holder.toDescriptorString()),
-        getOriginalName(),
+        getOriginalFieldName(),
         Reference.typeFromDescriptor(originalDexField.type.toDescriptorString()));
   }
 
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/Main.java b/src/test/java/com/android/tools/r8/utils/codeinspector/Main.java
index 220b795..63a6033 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/Main.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/Main.java
@@ -56,11 +56,10 @@
       return;
     }
 
-    List<FoundMethodSubject> found = clazzSubject
-        .allMethods()
-        .stream()
-        .filter(m -> m.getOriginalName().equals(methodName))
-        .collect(Collectors.toList());
+    List<FoundMethodSubject> found =
+        clazzSubject.allMethods().stream()
+            .filter(m -> m.getOriginalMethodName().equals(methodName))
+            .collect(Collectors.toList());
 
     System.out.println("Methods found: " + found.size());
     for (FoundMethodSubject methodSubject : found) {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java b/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
index be77daa..ada9ae9 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
@@ -63,11 +63,11 @@
   private static String name(Subject subject) {
     String name = "<unknown>";
     if (subject instanceof ClassSubject) {
-      name = ((ClassSubject) subject).getOriginalName();
+      name = ((ClassSubject) subject).getOriginalTypeName();
     } else if (subject instanceof MethodSubject) {
-      name = ((MethodSubject) subject).getOriginalName();
+      name = ((MethodSubject) subject).getOriginalMethodName();
     } else if (subject instanceof FieldSubject) {
-      name = ((FieldSubject) subject).getOriginalName();
+      name = ((FieldSubject) subject).getOriginalFieldName();
     } else if (subject instanceof AnnotationSubject) {
       name = ((AnnotationSubject) subject).getAnnotation().type.toSourceString();
     } else if (subject instanceof KmClassSubject) {
@@ -317,7 +317,9 @@
       @Override
       public void describeMismatchSafely(final ClassSubject clazz, Description description) {
         description
-            .appendText("class ").appendValue(clazz.getOriginalName()).appendText(" did not");
+            .appendText("class ")
+            .appendValue(clazz.getOriginalTypeName())
+            .appendText(" did not");
       }
     };
   }
@@ -336,7 +338,10 @@
 
       @Override
       public void describeMismatchSafely(final ClassSubject clazz, Description description) {
-        description.appendText("class ").appendValue(clazz.getOriginalName()).appendText(" is not");
+        description
+            .appendText("class ")
+            .appendValue(clazz.getOriginalTypeName())
+            .appendText(" is not");
       }
     };
   }
@@ -361,7 +366,7 @@
 
       @Override
       public void describeMismatchSafely(ClassOrMemberSubject subject, Description description) {
-        description.appendValue(subject.getOriginalName()).appendText(" was not");
+        description.appendText(name(subject)).appendText(" was not");
       }
     };
   }
@@ -429,7 +434,7 @@
 
       @Override
       public void describeMismatchSafely(final T subject, Description description) {
-        description.appendText("item ").appendValue(subject.getOriginalName()).appendText(" was ");
+        description.appendText("item ").appendText(name(subject)).appendText(" was ");
         if (subject.isPresent()) {
           AccessFlags<?> accessFlags = subject.getAccessFlags();
           if (accessFlags.isPublic()) {
@@ -462,7 +467,7 @@
 
       @Override
       public void describeMismatchSafely(final T subject, Description description) {
-        description.appendText("item ").appendValue(subject.getOriginalName()).appendText(" was ");
+        description.appendText("item ").appendValue(name(subject)).appendText(" was ");
         if (subject.isPresent()) {
           description.appendText("not native");
         } else {
@@ -554,7 +559,7 @@
 
       @Override
       public void describeTo(Description description) {
-        description.appendText("extends ").appendText(superSubject.getOriginalName());
+        description.appendText("extends ").appendText(superSubject.getOriginalTypeName());
       }
     };
   }
@@ -616,7 +621,7 @@
 
       @Override
       public void describeTo(Description description) {
-        description.appendText("implements ").appendText(interfaceSubject.getOriginalName());
+        description.appendText("implements ").appendText(interfaceSubject.getOriginalTypeName());
       }
     };
   }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java
index 8a0bab6..46d88f0 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java
@@ -12,24 +12,17 @@
 
   public abstract Signature getFinalSignature();
 
-  @Override
-  public String getOriginalName() {
-    return getOriginalName(true);
-  }
-
-  public String getOriginalName(boolean qualified) {
+  String getOriginalName() {
     Signature originalSignature = getOriginalSignature();
-    if (originalSignature != null) {
-      String name = originalSignature.name;
-      if (!qualified) {
-        int index = name.lastIndexOf(".");
-        if (index >= 0) {
-          return name.substring(index + 1);
-        }
-      }
-      return name;
+    if (originalSignature == null) {
+      return null;
     }
-    return null;
+    String name = originalSignature.getName();
+    int index = name.lastIndexOf(".");
+    if (index >= 0) {
+      return name.substring(index + 1);
+    }
+    return name;
   }
 
   public String getFinalName() {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
index 8e08f4f..02ecc3a 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
@@ -44,6 +44,10 @@
   @Override
   public abstract MethodAccessFlags getAccessFlags();
 
+  public String getOriginalMethodName() {
+    return getOriginalName();
+  }
+
   @Override
   public abstract MethodSignature getOriginalSignature();
 
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 c06e09d..73ca25e 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
@@ -157,7 +157,7 @@
       }
 
       ProtoMessageStats messageStats = null;
-      switch (superClassSubject.getOriginalName()) {
+      switch (superClassSubject.getOriginalTypeName()) {
         case GENERATED_MESSAGE_LITE_TYPE:
           messageStats = protoMessageStats;
           break;
@@ -174,7 +174,7 @@
 
         case EXTENSION_REGISTRY_LITE_TYPE:
           for (FoundMethodSubject methodSubject : classSubject.allMethods()) {
-            String originalMethodName = methodSubject.getOriginalName(false);
+            String originalMethodName = methodSubject.getOriginalMethodName();
             if (originalMethodName.startsWith("findLiteExtensionByNumber")) {
               generatedExtensionRegistryStats.findLiteExtensionByNumberMethods.add(
                   methodSubject.getOriginalDexMethod(dexItemFactory));
@@ -184,7 +184,7 @@
                 DexField field = instruction.getField();
                 FoundClassSubject typeClassSubject =
                     inspector.clazz(field.type.toSourceString()).asFoundClassSubject();
-                if (!typeClassSubject.getOriginalName().equals(GENERATED_EXTENSION_TYPE)) {
+                if (!typeClassSubject.getOriginalTypeName().equals(GENERATED_EXTENSION_TYPE)) {
                   continue;
                 }
                 FoundClassSubject extensionClassSubject =
@@ -204,7 +204,7 @@
       if (messageStats != null) {
         messageStats.messages.add(originalType);
         for (FoundFieldSubject fieldSubject : classSubject.allInstanceFields()) {
-          String originalFieldName = fieldSubject.getOriginalName(false);
+          String originalFieldName = fieldSubject.getOriginalFieldName();
           if (originalFieldName.startsWith("bitField")) {
             messageStats.bitFields.add(fieldSubject.getOriginalDexField(dexItemFactory));
           } else {
