Share DexField.field and DexMethod.method as DexMember.reference

Fixes: 167310581
Change-Id: I427fa117548d82e29b701fca746186c6627ecc9d
diff --git a/src/main/java/com/android/tools/r8/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
index 740984c..a47844f 100644
--- a/src/main/java/com/android/tools/r8/GenerateLintFiles.java
+++ b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
@@ -150,11 +150,11 @@
       assert method.getHolderType() == clazz.type;
       CfCode code = null;
       if (!method.accessFlags.isAbstract() /*&& !method.accessFlags.isNative()*/) {
-        code = buildEmptyThrowingCfCode(method.method);
+        code = buildEmptyThrowingCfCode(method.getReference());
       }
       DexEncodedMethod throwingMethod =
           new DexEncodedMethod(
-              method.method,
+              method.getReference(),
               method.accessFlags,
               MethodTypeSignature.noSignature(),
               DexAnnotationSet.empty(),
@@ -246,7 +246,7 @@
               continue;
             }
             ProgramMethod implementationMethod =
-                implementationClass.lookupProgramMethod(method.method);
+                implementationClass.lookupProgramMethod(method.getReference());
             // Don't include methods which are not implemented by the desugared library.
             if (supported.test(method) && implementationMethod != null) {
               supportedMethods.computeIfAbsent(clazz, k -> new ArrayList<>()).add(method);
@@ -265,10 +265,10 @@
         if (desugaredLibraryConfiguration
             .getRetargetCoreLibMember()
             .keySet()
-            .contains(method.method.name)) {
+            .contains(method.getReference().name)) {
           if (desugaredLibraryConfiguration
               .getRetargetCoreLibMember()
-              .get(method.method.name)
+              .get(method.getReference().name)
               .containsKey(clazz.type)) {
             if (supported.test(method)) {
               supportedMethods.computeIfAbsent(clazz, k -> new ArrayList<>()).add(method);
@@ -333,8 +333,8 @@
               desugaredApisSignatures.add(
                   classBinaryName
                       + '#'
-                      + method.method.name
-                      + method.method.proto.toDescriptorString());
+                      + method.getReference().name
+                      + method.getReference().proto.toDescriptorString());
             }
           } else {
             desugaredApisSignatures.add(classBinaryName);
@@ -405,7 +405,7 @@
             return true;
           }
           assert minApiLevel == AndroidApiLevel.B;
-          return !parallelMethods.contains(method.method);
+          return !parallelMethods.contains(method.getReference());
         });
   }
 
@@ -585,7 +585,7 @@
     }
 
     public String arguments(DexEncodedMethod method) {
-      DexProto proto = method.method.proto;
+      DexProto proto = method.getReference().proto;
       StringBuilder argsBuilder = new StringBuilder();
       boolean firstArg = true;
       int argIndex = method.isVirtualMethod() || method.accessFlags.isConstructor() ? 1 : 0;
@@ -685,9 +685,9 @@
           builder.appendLiCode(
               accessFlags(field.accessFlags)
                   + " "
-                  + typeInPackage(field.field.type)
+                  + typeInPackage(field.getReference().type)
                   + " "
-                  + field.field.name);
+                  + field.getReference().name);
         }
       }
       if (!constructors.isEmpty()) {
@@ -705,12 +705,12 @@
           builder.appendLiCode(
               accessFlags(method.accessFlags)
                   + " "
-                  + typeInPackage(method.method.proto.returnType)
+                  + typeInPackage(method.getReference().proto.returnType)
                   + " "
-                  + method.method.name
+                  + method.getReference().name
                   + arguments(method));
-          if (parallelMethods.contains(method.method)) {
-            parallelM.add(method.method.name.toString());
+          if (parallelMethods.contains(method.getReference())) {
+            parallelM.add(method.getReference().name.toString());
           }
         }
       }
diff --git a/src/main/java/com/android/tools/r8/JarDiff.java b/src/main/java/com/android/tools/r8/JarDiff.java
index a268496..446791f 100644
--- a/src/main/java/com/android/tools/r8/JarDiff.java
+++ b/src/main/java/com/android/tools/r8/JarDiff.java
@@ -145,23 +145,23 @@
   private void compareMethods(DexProgramClass class1, DexProgramClass class2) {
     class1.forEachMethod(
         method1 -> {
-          DexEncodedMethod method2 = class2.lookupMethod(method1.method);
+          DexEncodedMethod method2 = class2.lookupMethod(method1.getReference());
           compareMethods(method1, method2);
         });
     class2.forEachMethod(
         method2 -> {
-          DexEncodedMethod method1 = class1.lookupMethod(method2.method);
+          DexEncodedMethod method1 = class1.lookupMethod(method2.getReference());
           compareMethods(method1, method2);
         });
   }
 
   private void compareMethods(DexEncodedMethod m1, DexEncodedMethod m2) {
     if (m1 == null) {
-      System.out.println("Only in " + path2 + ": " + m2.method.toSourceString());
+      System.out.println("Only in " + path2 + ": " + m2.getReference().toSourceString());
       return;
     }
     if (m2 == null) {
-      System.out.println("Only in " + path1 + ": " + m1.method.toSourceString());
+      System.out.println("Only in " + path1 + ": " + m1.getReference().toSourceString());
       return;
     }
     List<String> code1 = getInstructionStrings(m1);
@@ -176,12 +176,19 @@
     int before = Math.min(i, this.before);
     int after = Math.min(j, this.after);
     int context = before + after;
-    System.out.println("--- " + path1 + "/" + m1.method.toSmaliString());
-    System.out.println("+++ " + path2 + "/" + m2.method.toSmaliString());
+    System.out.println("--- " + path1 + "/" + m1.getReference().toSmaliString());
+    System.out.println("+++ " + path2 + "/" + m2.getReference().toSmaliString());
     System.out.println(
-        "@@ -" + (i - before) + "," + (length1 + context)
-            + " +" + (i - before) + "," + (length2 + context) + " @@ "
-            + m1.method.toSourceString());
+        "@@ -"
+            + (i - before)
+            + ","
+            + (length1 + context)
+            + " +"
+            + (i - before)
+            + ","
+            + (length2 + context)
+            + " @@ "
+            + m1.getReference().toSourceString());
     for (int k = 0; k < before; k++) {
       System.out.println(" " + code1.get(i - before + k));
     }
diff --git a/src/main/java/com/android/tools/r8/JarSizeCompare.java b/src/main/java/com/android/tools/r8/JarSizeCompare.java
index 15e29fa..e520d1b 100644
--- a/src/main/java/com/android/tools/r8/JarSizeCompare.java
+++ b/src/main/java/com/android/tools/r8/JarSizeCompare.java
@@ -332,8 +332,9 @@
             MethodSignature originalSignature =
                 proguardMap == null
                     ? null
-                    : proguardMap.originalSignatureOf(dexEncodedMethod.method);
-            MethodSignature signature = MethodSignature.fromDexMethod(dexEncodedMethod.method);
+                    : proguardMap.originalSignatureOf(dexEncodedMethod.getReference());
+            MethodSignature signature =
+                MethodSignature.fromDexMethod(dexEncodedMethod.getReference());
             consumer.accept(
                 originalSignature == null ? signature : originalSignature, dexEncodedMethod);
           });
@@ -346,8 +347,10 @@
       programClass.forEachField(
           dexEncodedField -> {
             FieldSignature originalSignature =
-                proguardMap == null ? null : proguardMap.originalSignatureOf(dexEncodedField.field);
-            FieldSignature signature = FieldSignature.fromDexField(dexEncodedField.field);
+                proguardMap == null
+                    ? null
+                    : proguardMap.originalSignatureOf(dexEncodedField.getReference());
+            FieldSignature signature = FieldSignature.fromDexField(dexEncodedField.getReference());
             consumer.accept(
                 originalSignature == null ? signature : originalSignature, dexEncodedField);
           });
diff --git a/src/main/java/com/android/tools/r8/PrintClassList.java b/src/main/java/com/android/tools/r8/PrintClassList.java
index 73cb04d..1530251 100644
--- a/src/main/java/com/android/tools/r8/PrintClassList.java
+++ b/src/main/java/com/android/tools/r8/PrintClassList.java
@@ -57,7 +57,7 @@
   }
 
   private static void printMethod(DexEncodedMethod encodedMethod, ClassNameMapper map) {
-    DexMethod method = encodedMethod.method;
+    DexMethod method = encodedMethod.getReference();
     if (map != null) {
       System.out.println(map.originalNameOf(method));
     } else {
@@ -68,7 +68,7 @@
   }
 
   private static void printField(DexEncodedField encodedField, ClassNameMapper map) {
-    DexField field = encodedField.field;
+    DexField field = encodedField.getReference();
     if (map != null) {
       System.out.println(map.originalNameOf(field));
     } else {
diff --git a/src/main/java/com/android/tools/r8/PrintUses.java b/src/main/java/com/android/tools/r8/PrintUses.java
index d7310e5..926577f 100644
--- a/src/main/java/com/android/tools/r8/PrintUses.java
+++ b/src/main/java/com/android/tools/r8/PrintUses.java
@@ -108,9 +108,9 @@
       ResolutionResult resolutionResult = appInfo.unsafeResolveMethodDueToDexFormat(method);
       DexEncodedMethod target =
           resolutionResult.isVirtualTarget() ? resolutionResult.getSingleTarget() : null;
-      if (target != null && target.method != method) {
+      if (target != null && target.getReference() != method) {
         addType(method.holder);
-        addMethod(target.method);
+        addMethod(target.getReference());
       } else {
         addMethod(method);
       }
@@ -124,9 +124,9 @@
     @Override
     public void registerInvokeStatic(DexMethod method) {
       DexEncodedMethod target = appInfo.unsafeResolveMethodDueToDexFormat(method).getSingleTarget();
-      if (target != null && target.method != method) {
+      if (target != null && target.getReference() != method) {
         addType(method.holder);
-        addMethod(target.method);
+        addMethod(target.getReference());
       } else {
         addMethod(method);
       }
@@ -204,7 +204,7 @@
       addType(field.type);
       DexEncodedField baseField = appInfo.resolveField(field).getResolvedField();
       if (baseField != null && baseField.getHolderType() != field.holder) {
-        field = baseField.field;
+        field = baseField.getReference();
       }
       addType(field.holder);
       Set<DexField> typeFields = fields.get(field.holder);
@@ -245,7 +245,7 @@
     }
 
     private void registerField(DexEncodedField field) {
-      registerTypeReference(field.field.type);
+      registerTypeReference(field.getReference().type);
     }
 
     private void registerMethod(ProgramMethod method) {
@@ -277,10 +277,11 @@
       clazz.forEachMethod(
           method -> {
             ResolutionResult resolutionResult =
-                appInfo.resolveMethodOn(superType, method.method, superType != clazz.superType);
+                appInfo.resolveMethodOn(
+                    superType, method.getReference(), superType != clazz.superType);
             DexEncodedMethod dexEncodedMethod = resolutionResult.getSingleTarget();
             if (dexEncodedMethod != null) {
-              addMethod(dexEncodedMethod.method);
+              addMethod(dexEncodedMethod.getReference());
             }
           });
     }
@@ -428,7 +429,7 @@
       if (encodedMethod.accessFlags.isConstructor()) {
         printConstructorName(encodedMethod);
       } else {
-        DexMethod method = encodedMethod.method;
+        DexMethod method = encodedMethod.getReference();
         append(method.proto.returnType.toSourceString());
         append(" ");
         append(method.name.toSourceString());
@@ -467,7 +468,7 @@
           }
           methodDefinitions.add(encodedMethod);
         }
-        methodDefinitions.sort(Comparator.comparing(x -> x.method.name.toSourceString()));
+        methodDefinitions.sort(Comparator.comparing(x -> x.getReference().name.toSourceString()));
         for (DexEncodedMethod encodedMethod : methodDefinitions) {
           printMethod(encodedMethod, dexClass.type.toSourceString());
         }
@@ -506,7 +507,7 @@
     void printMethod(DexEncodedMethod encodedMethod, String typeName) {
       append(typeName + ": ");
       printNameAndReturn(encodedMethod);
-      printArguments(encodedMethod.method);
+      printArguments(encodedMethod.getReference());
       appendLine("");
     }
 
@@ -578,7 +579,7 @@
         append("static ");
       }
       printNameAndReturn(encodedMethod);
-      printArguments(encodedMethod.method);
+      printArguments(encodedMethod.getReference());
       appendLine(";");
     }
 
diff --git a/src/main/java/com/android/tools/r8/cf/CfPrinter.java b/src/main/java/com/android/tools/r8/cf/CfPrinter.java
index 9862f27..64dd9a5 100644
--- a/src/main/java/com/android/tools/r8/cf/CfPrinter.java
+++ b/src/main/java/com/android/tools/r8/cf/CfPrinter.java
@@ -140,7 +140,7 @@
     }
     if (method != null) {
       builder.append(".method ");
-      appendMethod(method.method);
+      appendMethod(method.getReference());
       newline();
     }
     builder.append(".limit stack ").append(code.getMaxStack());
diff --git a/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java b/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java
index ec4b22f..90fc9ee 100644
--- a/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java
+++ b/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java
@@ -242,7 +242,8 @@
                   : createInitializedType(code.method().getHolderType());
         } else {
           argumentType =
-              createInitializedType(code.method().method.proto.parameters.values[argumentIndex]);
+              createInitializedType(
+                  code.method().getReference().proto.parameters.values[argumentIndex]);
         }
         Value outValue = instruction.outValue();
         if (outValue.outType().isObject()) {
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index adfab44..889fc27 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -275,25 +275,25 @@
   //     static methods, as well as public non-abstract (default)
   //     and private instance methods.
   private void checkInterfaceMethod(DexEncodedMethod method) {
-    if (application.dexItemFactory.isClassConstructor(method.method)) {
+    if (application.dexItemFactory.isClassConstructor(method.getReference())) {
       return; // Class constructor is always OK.
     }
     if (method.accessFlags.isStatic()) {
       if (!options.canUseDefaultAndStaticInterfaceMethods()
           && !options.testing.allowStaticInterfaceMethodsForPreNApiLevel) {
         throw options.reporter.fatalError(
-            new StaticInterfaceMethodDiagnostic(new MethodPosition(method.method)));
+            new StaticInterfaceMethodDiagnostic(new MethodPosition(method.getReference())));
       }
 
     } else {
       if (method.isInstanceInitializer()) {
         throw new CompilationError(
-            "Interface must not have constructors: " + method.method.toSourceString());
+            "Interface must not have constructors: " + method.getReference().toSourceString());
       }
       if (!method.accessFlags.isAbstract() && !method.accessFlags.isPrivate() &&
           !options.canUseDefaultAndStaticInterfaceMethods()) {
         throw options.reporter.fatalError(
-            new DefaultInterfaceMethodDiagnostic(new MethodPosition(method.method)));
+            new DefaultInterfaceMethodDiagnostic(new MethodPosition(method.getReference())));
       }
     }
 
@@ -302,12 +302,14 @@
         return;
       }
       throw options.reporter.fatalError(
-          new PrivateInterfaceMethodDiagnostic(new MethodPosition(method.method)));
+          new PrivateInterfaceMethodDiagnostic(new MethodPosition(method.getReference())));
     }
 
     if (!method.accessFlags.isPublic()) {
-      throw new CompilationError("Interface methods must not be "
-          + "protected or package private: " + method.method.toSourceString());
+      throw new CompilationError(
+          "Interface methods must not be "
+              + "protected or package private: "
+              + method.getReference().toSourceString());
     }
   }
 
@@ -636,32 +638,36 @@
 
   private void writeEncodedFields(List<DexEncodedField> unsortedFields) {
     List<DexEncodedField> fields = new ArrayList<>(unsortedFields);
-    fields.sort((a, b) -> a.field.acceptCompareTo(b.field, mapping.getCompareToVisitor()));
+    fields.sort(
+        (a, b) ->
+            a.getReference().acceptCompareTo(b.getReference(), mapping.getCompareToVisitor()));
     int currentOffset = 0;
     for (DexEncodedField field : fields) {
       assert field.validateDexValue(application.dexItemFactory);
-      int nextOffset = mapping.getOffsetFor(field.field);
+      int nextOffset = mapping.getOffsetFor(field.getReference());
       assert nextOffset - currentOffset >= 0;
       dest.putUleb128(nextOffset - currentOffset);
       currentOffset = nextOffset;
       dest.putUleb128(field.accessFlags.getAsDexAccessFlags());
-      desugaredLibraryCodeToKeep.recordField(field.field);
+      desugaredLibraryCodeToKeep.recordField(field.getReference());
     }
   }
 
   private void writeEncodedMethods(
       Iterable<DexEncodedMethod> unsortedMethods, boolean isSharedSynthetic) {
     List<DexEncodedMethod> methods = IterableUtils.toNewArrayList(unsortedMethods);
-    methods.sort((a, b) -> a.method.acceptCompareTo(b.method, mapping.getCompareToVisitor()));
+    methods.sort(
+        (a, b) ->
+            a.getReference().acceptCompareTo(b.getReference(), mapping.getCompareToVisitor()));
     int currentOffset = 0;
     for (DexEncodedMethod method : methods) {
-      int nextOffset = mapping.getOffsetFor(method.method);
+      int nextOffset = mapping.getOffsetFor(method.getReference());
       assert nextOffset - currentOffset >= 0;
       dest.putUleb128(nextOffset - currentOffset);
       currentOffset = nextOffset;
       dest.putUleb128(method.accessFlags.getAsDexAccessFlags());
       DexCode code = codeMapping.getCode(method);
-      desugaredLibraryCodeToKeep.recordMethod(method.method);
+      desugaredLibraryCodeToKeep.recordMethod(method.getReference());
       if (code == null) {
         assert method.shouldNotHaveCode();
         dest.putUleb128(0);
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
index c8d9834..0056aff 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
@@ -455,7 +455,7 @@
     }
     assert potentialHolder.isInterface();
     for (DexEncodedMethod virtualMethod : potentialHolder.virtualMethods()) {
-      if (virtualMethod.method.hasSameProtoAndName(method.method)
+      if (virtualMethod.getReference().hasSameProtoAndName(method.getReference())
           && virtualMethod.accessFlags.isSameVisibility(method.accessFlags)) {
         return true;
       }
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java
index 7622121..7321cc0 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -588,11 +588,11 @@
     if (!options().isGeneratingClassFiles()) {
       return false;
     }
-    if (cfByteCodePassThrough.contains(method.method)) {
+    if (cfByteCodePassThrough.contains(method.getReference())) {
       return true;
     }
     return options().testing.cfByteCodePassThrough != null
-        && options().testing.cfByteCodePassThrough.test(method.method);
+        && options().testing.cfByteCodePassThrough.test(method.getReference());
   }
 
   public boolean hasCfByteCodePassThroughMethods() {
diff --git a/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java b/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
index 349332a..a05960f 100644
--- a/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
@@ -50,7 +50,7 @@
 
       // Record original field signatures.
       for (DexEncodedField encodedField : clazz.fields()) {
-        DexField field = encodedField.field;
+        DexField field = encodedField.getReference();
         DexField original = appView.graphLens().getOriginalFieldSignature(field);
         if (original != field) {
           DexField existing = originalFieldSignatures.forcePut(field, original);
@@ -60,7 +60,7 @@
 
       // Record original method signatures.
       for (DexEncodedMethod encodedMethod : clazz.methods()) {
-        DexMethod method = encodedMethod.method;
+        DexMethod method = encodedMethod.getReference();
         DexMethod original = appView.graphLens().getOriginalMethodSignature(method);
         DexMethod existing = originalMethodSignatures.inverse().get(original);
         if (existing == null) {
diff --git a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
index 1c30bbf..4ed66d8 100644
--- a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
+++ b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
@@ -128,9 +128,10 @@
   void writeField(DexEncodedField field, PrintStream ps) {
     if (writeFields) {
       ClassNameMapper naming = application.getProguardMap();
-      FieldSignature fieldSignature = naming != null
-          ? naming.originalSignatureOf(field.field)
-          : FieldSignature.fromDexField(field.field);
+      FieldSignature fieldSignature =
+          naming != null
+              ? naming.originalSignatureOf(field.getReference())
+              : FieldSignature.fromDexField(field.getReference());
       writeAnnotations(null, field.annotations(), ps);
       ps.print(field.accessFlags + " ");
       ps.print(fieldSignature);
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index 71b938f..315bb3e 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -300,7 +300,7 @@
     }
     // If tree shaking, only keep annotations on kept methods.
     if (appView.appInfo().hasLiveness()
-        && !appView.appInfo().withLiveness().isPinned(method.method)) {
+        && !appView.appInfo().withLiveness().isPinned(method.getReference())) {
       return false;
     }
     return true;
@@ -575,7 +575,7 @@
     // The enqueuer might build IR to trace reflective behaviour. At that point liveness is not
     // known, so be conservative with collection parameter name information.
     if (appView.appInfo().hasLiveness()
-        && !appView.appInfo().withLiveness().isPinned(encodedMethod.method)) {
+        && !appView.appInfo().withLiveness().isPinned(encodedMethod.getReference())) {
       return DexEncodedMethod.NO_PARAMETER_INFO;
     }
 
@@ -585,7 +585,7 @@
     if (!encodedMethod.isStatic()) {
       localSlotsForParameters.set(nextLocalSlotsForParameters++);
     }
-    for (DexType type : encodedMethod.method.proto.parameters.values) {
+    for (DexType type : encodedMethod.getReference().proto.parameters.values) {
       localSlotsForParameters.set(nextLocalSlotsForParameters);
       nextLocalSlotsForParameters += type.isLongType() || type.isDoubleType() ? 2 : 1;
     }
@@ -607,7 +607,7 @@
 
   @Override
   public void registerArgumentReferences(DexEncodedMethod method, ArgumentUse registry) {
-    DexProto proto = method.method.proto;
+    DexProto proto = method.getReference().proto;
     boolean isStatic = method.accessFlags.isStatic();
     int argumentCount = proto.parameters.values.length + (isStatic ? 0 : 1);
     Int2IntArrayMap indexToNumber = new Int2IntArrayMap(argumentCount);
@@ -728,7 +728,7 @@
     if (!method.isInstanceInitializer()
         && appView
             .graphLens()
-            .getOriginalMethodSignature(method.method)
+            .getOriginalMethodSignature(method.getReference())
             .isInstanceInitializer(appView.dexItemFactory())) {
       // We cannot verify instance initializers if they are moved.
       return StackMapStatus.NOT_PRESENT;
@@ -746,7 +746,7 @@
               return reportStackMapError(
                   CfCodeStackMapValidatingException.multipleFramesForLabel(
                       origin,
-                      appView.graphLens().getOriginalMethodSignature(method.method),
+                      appView.graphLens().getOriginalMethodSignature(method.getReference()),
                       appView),
                   appView);
             }
@@ -756,7 +756,9 @@
           // From b/168212806, it is possible that the first instruction is a frame.
           return reportStackMapError(
               CfCodeStackMapValidatingException.unexpectedStackMapFrame(
-                  origin, appView.graphLens().getOriginalMethodSignature(method.method), appView),
+                  origin,
+                  appView.graphLens().getOriginalMethodSignature(method.getReference()),
+                  appView),
               appView);
         }
       }
@@ -777,15 +779,17 @@
     if (requireStackMapFrame && stateMap.isEmpty()) {
       return reportStackMapError(
           CfCodeStackMapValidatingException.noFramesForMethodWithJumps(
-              origin, appView.graphLens().getOriginalMethodSignature(method.method), appView),
+              origin,
+              appView.graphLens().getOriginalMethodSignature(method.getReference()),
+              appView),
           appView);
     }
     DexType context = appView.graphLens().lookupType(method.getHolderType());
-    DexType returnType = appView.graphLens().lookupType(method.method.getReturnType());
+    DexType returnType = appView.graphLens().lookupType(method.getReference().getReturnType());
     RewrittenPrototypeDescription rewrittenDescription = RewrittenPrototypeDescription.none();
     if (applyProtoTypeChanges) {
       rewrittenDescription =
-          appView.graphLens().lookupPrototypeChangesForMethodDefinition(method.method);
+          appView.graphLens().lookupPrototypeChangesForMethodDefinition(method.getReference());
       if (!rewrittenDescription.isEmpty()
           && rewrittenDescription.getRewrittenReturnInfo() != null) {
         returnType = rewrittenDescription.getRewrittenReturnInfo().getOldType();
@@ -824,7 +828,7 @@
         return reportStackMapError(
             CfCodeStackMapValidatingException.toDiagnostics(
                 origin,
-                appView.graphLens().getOriginalMethodSignature(method.method),
+                appView.graphLens().getOriginalMethodSignature(method.getReference()),
                 i,
                 instruction,
                 ex.getMessage(),
@@ -889,7 +893,7 @@
       initialLocals.put(index++, FrameType.initialized(context));
     }
     ArgumentInfoCollection argumentsInfo = protoTypeChanges.getArgumentInfoCollection();
-    DexType[] parameters = method.method.proto.parameters.values;
+    DexType[] parameters = method.getReference().proto.parameters.values;
     int originalNumberOfArguments =
         parameters.length
             + argumentsInfo.numberOfRemovedArguments()
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java b/src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java
index ad9bf23..d2d763e 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java
@@ -46,17 +46,18 @@
   }
 
   public List<DexEncodedMethod> sortMethodAnnotations(CompareToVisitor visitor) {
-    methodAnnotations.sort((a, b) -> a.method.acceptCompareTo(b.method, visitor));
+    methodAnnotations.sort((a, b) -> a.getReference().acceptCompareTo(b.getReference(), visitor));
     return methodAnnotations;
   }
 
   public List<DexEncodedMethod> sortParameterAnnotations(CompareToVisitor visitor) {
-    parameterAnnotations.sort((a, b) -> a.method.acceptCompareTo(b.method, visitor));
+    parameterAnnotations.sort(
+        (a, b) -> a.getReference().acceptCompareTo(b.getReference(), visitor));
     return parameterAnnotations;
   }
 
   public List<DexEncodedField> sortFieldAnnotations(CompareToVisitor visitor) {
-    fieldAnnotations.sort((a, b) -> a.field.acceptCompareTo(b.field, visitor));
+    fieldAnnotations.sort((a, b) -> a.getReference().acceptCompareTo(b.getReference(), visitor));
     return fieldAnnotations;
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexClass.java b/src/main/java/com/android/tools/r8/graph/DexClass.java
index 130dbcf..0b4b188 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -257,7 +257,9 @@
     if (options.canHaveDalvikAbstractMethodOnNonAbstractClassVerificationBug() && !isAbstract()) {
       for (DexEncodedMethod method : methods) {
         assert !method.isAbstract()
-            : "Non-abstract method on abstract class: `" + method.method.toSourceString() + "`";
+            : "Non-abstract method on abstract class: `"
+                + method.getReference().toSourceString()
+                + "`";
       }
     }
     return true;
@@ -363,7 +365,7 @@
 
   public boolean definesStaticField(DexField field) {
     for (DexEncodedField encodedField : staticFields()) {
-      if (encodedField.field == field) {
+      if (encodedField.getReference() == field) {
         return true;
       }
     }
@@ -427,7 +429,7 @@
   private boolean verifyCorrectnessOfFieldHolder(DexEncodedField field) {
     assert field.getHolderType() == type
         : "Expected field `"
-            + field.field.toSourceString()
+            + field.getReference().toSourceString()
             + "` to have holder `"
             + type.toSourceString()
             + "`";
@@ -444,8 +446,8 @@
   private boolean verifyNoDuplicateFields() {
     Set<DexField> unique = Sets.newIdentityHashSet();
     for (DexEncodedField field : fields()) {
-      boolean changed = unique.add(field.field);
-      assert changed : "Duplicate field `" + field.field.toSourceString() + "`";
+      boolean changed = unique.add(field.getReference());
+      assert changed : "Duplicate field `" + field.getReference().toSourceString() + "`";
     }
     return true;
   }
@@ -463,11 +465,11 @@
   public DexField lookupUniqueInstanceFieldWithName(DexString name) {
     DexField field = null;
     for (DexEncodedField encodedField : instanceFields()) {
-      if (encodedField.field.name == name) {
+      if (encodedField.getReference().name == name) {
         if (field != null) {
           return null;
         }
-        field = encodedField.field;
+        field = encodedField.getReference();
       }
     }
     return field;
@@ -544,7 +546,7 @@
     DexEncodedMethod matchingName = null;
     DexEncodedMethod signaturePolymorphicMethod = null;
     for (DexEncodedMethod method : virtualMethods()) {
-      if (method.method.name == methodName) {
+      if (method.getReference().name == methodName) {
         if (matchingName != null) {
           // The jvm spec, section 5.4.3.3 details that there must be exactly one method with the
           // given name only.
@@ -564,8 +566,8 @@
         || method.getHolderType() == factory.varHandleType;
     return method.accessFlags.isVarargs()
         && method.accessFlags.isNative()
-        && method.method.proto.parameters.size() == 1
-        && method.method.proto.parameters.values[0] != factory.objectArrayType;
+        && method.getReference().proto.parameters.size() == 1
+        && method.getReference().proto.parameters.values[0] != factory.objectArrayType;
   }
 
   private <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>> D lookupTarget(
@@ -704,7 +706,7 @@
   public DexEncodedMethod getInitializer(DexType[] parameters) {
     for (DexEncodedMethod method : directMethods()) {
       if (method.isInstanceInitializer()
-          && Arrays.equals(method.method.proto.parameters.values, parameters)) {
+          && Arrays.equals(method.getReference().proto.parameters.values, parameters)) {
         return method;
       }
     }
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java b/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
index 32743f0..09bc3b7 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
@@ -63,11 +63,11 @@
   }
 
   public DexDebugEntryBuilder(DexEncodedMethod method, DexItemFactory factory) {
-    assert method != null && method.method != null;
-    this.method = method.method;
+    assert method != null && method.getReference() != null;
+    this.method = method.getReference();
     positionState =
         new DexDebugPositionState(
-            method.getCode().asDexCode().getDebugInfo().startLine, method.method);
+            method.getCode().asDexCode().getDebugInfo().startLine, method.getReference());
     DexCode code = method.getCode().asDexCode();
     DexDebugInfo info = code.getDebugInfo();
     int argumentRegister = code.registerSize - code.incomingRegisterSize;
@@ -77,7 +77,7 @@
       startArgument(argumentRegister, name, type);
       argumentRegister += ValueType.fromDexType(type).requiredRegisters();
     }
-    DexType[] types = method.method.proto.parameters.values;
+    DexType[] types = method.getReference().proto.parameters.values;
     DexString[] names = info.parameters;
     for (int i = 0; i < types.length; i++) {
       // If null, the parameter has a parameterized type and the local is introduced in the stream.
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
index f166e3c..bdfe991 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
@@ -110,7 +110,7 @@
     if (startLine == NO_LINE_INFO) {
       return null;
     }
-    DexString[] params = new DexString[method.method.getArity()];
+    DexString[] params = new DexString[method.getReference().getArity()];
     if (arguments != null) {
       assert params.length == arguments.size();
       for (int i = 0; i < arguments.size(); i++) {
@@ -158,7 +158,7 @@
 
   private void startArgument(Argument argument) {
     if (arguments == null) {
-      arguments = new ArrayList<>(method.method.getArity());
+      arguments = new ArrayList<>(method.getReference().getArity());
     }
     if (!argument.outValue().isThis()) {
       arguments.add(argument.getLocalInfo());
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
index 1a2b411..65bc4fb 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
@@ -31,7 +31,6 @@
     implements StructuralItem<DexEncodedField> {
   public static final DexEncodedField[] EMPTY_ARRAY = {};
 
-  public final DexField field;
   public final FieldAccessFlags accessFlags;
   private DexValue staticValue;
   private final boolean deprecated;
@@ -42,10 +41,10 @@
   private KotlinFieldLevelInfo kotlinMemberInfo = NO_KOTLIN_INFO;
 
   private static void specify(StructuralSpecification<DexEncodedField, ?> spec) {
-    spec.withItem(f -> f.field)
-        .withItem(f -> f.accessFlags)
+    spec.withItem(DexEncodedField::getReference)
+        .withItem(DexEncodedField::getAccessFlags)
         .withNullableItem(f -> f.staticValue)
-        .withBool(f -> f.deprecated)
+        .withBool(DexEncodedField::isDeprecated)
         // TODO(b/171867022): The generic signature should be part of the definition.
         .withAssert(f -> f.genericSignature.hasNoSignature());
     // TODO(b/171867022): Should the optimization info and member info be part of the definition?
@@ -82,8 +81,7 @@
       DexValue staticValue,
       boolean deprecated,
       boolean d8R8Synthesized) {
-    super(annotations, d8R8Synthesized);
-    this.field = field;
+    super(field, annotations, d8R8Synthesized);
     this.accessFlags = accessFlags;
     this.staticValue = staticValue;
     this.deprecated = deprecated;
@@ -103,7 +101,7 @@
   }
 
   public DexType type() {
-    return field.type;
+    return getReference().type;
   }
 
   public boolean isDeprecated() {
@@ -111,8 +109,8 @@
   }
 
   public boolean isProgramField(DexDefinitionSupplier definitions) {
-    if (field.holder.isClassType()) {
-      DexClass clazz = definitions.definitionFor(field.holder);
+    if (getReference().holder.isClassType()) {
+      DexClass clazz = definitions.definitionFor(getReference().holder);
       return clazz != null && clazz.isProgramClass();
     }
     return false;
@@ -158,22 +156,17 @@
 
   @Override
   public String toString() {
-    return "Encoded field " + field;
+    return "Encoded field " + getReference();
   }
 
   @Override
   public String toSmaliString() {
-    return field.toSmaliString();
+    return getReference().toSmaliString();
   }
 
   @Override
   public String toSourceString() {
-    return field.toSourceString();
-  }
-
-  @Override
-  public DexField getReference() {
-    return field;
+    return getReference().toSourceString();
   }
 
   public DexType getType() {
@@ -201,7 +194,7 @@
 
   public ProgramField asProgramField(DexDefinitionSupplier definitions) {
     assert getHolderType().isClassType();
-    DexProgramClass clazz = asProgramClassOrNull(definitions.definitionForHolder(field));
+    DexProgramClass clazz = asProgramClassOrNull(definitions.definitionForHolder(getReference()));
     if (clazz != null) {
       return new ProgramField(clazz, this);
     }
@@ -264,7 +257,7 @@
 
   public DexValue getStaticValue() {
     assert accessFlags.isStatic();
-    return staticValue == null ? DexValue.defaultForType(field.type) : staticValue;
+    return staticValue == null ? DexValue.defaultForType(getReference().type) : staticValue;
   }
 
   /**
@@ -277,7 +270,7 @@
     boolean isWritten = appView.appInfo().isFieldWrittenByFieldPutInstruction(this);
     if (!isWritten) {
       // Since the field is not written, we can simply return the default value for the type.
-      DexValue value = isStatic() ? getStaticValue() : DexValue.defaultForType(field.type);
+      DexValue value = isStatic() ? getStaticValue() : DexValue.defaultForType(getReference().type);
       return value.asConstInstruction(appView, code, local);
     }
 
@@ -286,11 +279,11 @@
     if (abstractValue.isSingleValue()) {
       SingleValue singleValue = abstractValue.asSingleValue();
       if (singleValue.isSingleFieldValue()
-          && singleValue.asSingleFieldValue().getField() == field) {
+          && singleValue.asSingleFieldValue().getField() == getReference()) {
         return null;
       }
       if (singleValue.isMaterializableInContext(appView, code.context())) {
-        TypeElement type = TypeElement.fromDexType(field.type, maybeNull(), appView);
+        TypeElement type = TypeElement.fromDexType(getReference().type, maybeNull(), appView);
         return singleValue.createMaterializingInstruction(
             appView, code, TypeAndLocalInfoSupplier.create(type, local));
       }
@@ -299,12 +292,12 @@
     // The only way to figure out whether the static value contains the final value is ensure the
     // value is not the default or check that <clinit> is not present.
     if (accessFlags.isFinal() && isStatic()) {
-      DexClass clazz = appView.definitionFor(field.holder);
+      DexClass clazz = appView.definitionFor(getReference().holder);
       if (clazz == null || clazz.hasClassInitializer()) {
         return null;
       }
       DexValue staticValue = getStaticValue();
-      if (!staticValue.isDefault(field.type)) {
+      if (!staticValue.isDefault(getReference().type)) {
         return staticValue.asConstInstruction(appView, code, local);
       }
     }
@@ -317,7 +310,7 @@
   }
 
   public DexEncodedField toTypeSubstitutedField(DexField field, Consumer<Builder> consumer) {
-    if (this.field == field) {
+    if (this.getReference() == field) {
       return this;
     }
     return builder(this).setField(field).apply(consumer).build();
@@ -327,12 +320,13 @@
     if (!accessFlags.isStatic() || staticValue == null) {
       return true;
     }
-    if (field.type.isPrimitiveType()) {
-      assert staticValue.getType(factory) == field.type
-          : "Static " + field + " has invalid static value " + staticValue + ".";
+    if (getReference().type.isPrimitiveType()) {
+      assert staticValue.getType(factory) == getReference().type
+          : "Static " + getReference() + " has invalid static value " + staticValue + ".";
     }
     if (staticValue.isDexValueNull()) {
-      assert field.type.isReferenceType() : "Static " + field + " has invalid null static value.";
+      assert getReference().type.isReferenceType()
+          : "Static " + getReference() + " has invalid null static value.";
     }
     // TODO(b/150593449): Support non primitive DexValue (String, enum) and add assertions.
     return true;
@@ -369,7 +363,7 @@
 
     Builder(DexEncodedField from) {
       // Copy all the mutable state of a DexEncodedField here.
-      field = from.field;
+      field = from.getReference();
       accessFlags = from.accessFlags.copy();
       // TODO(b/169923358): Consider removing the fieldSignature here.
       genericSignature = from.getGenericSignature();
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMember.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMember.java
index 7d66bb6..0074842 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMember.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMember.java
@@ -16,8 +16,11 @@
   // set.
   private final boolean d8R8Synthesized;
 
-  public DexEncodedMember(DexAnnotationSet annotations, boolean d8R8Synthesized) {
+  private final R reference;
+
+  public DexEncodedMember(R reference, DexAnnotationSet annotations, boolean d8R8Synthesized) {
     super(annotations);
+    this.reference = reference;
     this.d8R8Synthesized = d8R8Synthesized;
   }
 
@@ -32,7 +35,9 @@
   }
 
   @Override
-  public abstract R getReference();
+  public R getReference() {
+    return reference;
+  }
 
   public boolean isD8R8Synthesized() {
     return d8R8Synthesized;
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 470bee9..967b7e8 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -150,7 +150,6 @@
   public static final Int2ReferenceMap<DebugLocalInfo> NO_PARAMETER_INFO =
       new Int2ReferenceArrayMap<>(0);
 
-  public final DexMethod method;
   public final MethodAccessFlags accessFlags;
   public final boolean deprecated;
   public ParameterAnnotationsList parameterAnnotationsList;
@@ -311,8 +310,7 @@
       boolean d8R8Synthesized,
       CfVersion classFileVersion,
       boolean deprecated) {
-    super(annotations, d8R8Synthesized);
-    this.method = method;
+    super(method, annotations, d8R8Synthesized);
     this.accessFlags = accessFlags;
     this.deprecated = deprecated;
     this.genericSignature = genericSignature;
@@ -386,7 +384,7 @@
   @Override
   public DexMethod getReference() {
     checkIfObsolete();
-    return method;
+    return super.getReference();
   }
 
   public DexType getParameter(int index) {
@@ -398,11 +396,11 @@
   }
 
   public DexMethodSignature getSignature() {
-    return new DexMethodSignature(method);
+    return new DexMethodSignature(getReference());
   }
 
   public DexType returnType() {
-    return method.proto.returnType;
+    return getReference().proto.returnType;
   }
 
   public ParameterAnnotationsList liveParameterAnnotations(AppView<AppInfoWithLiveness> appView) {
@@ -420,19 +418,19 @@
     assert isLibraryMethodOverride.isPossiblyFalse()
             || this.isLibraryMethodOverride.isPossiblyTrue()
         : "Method `"
-            + method.toSourceString()
+            + getReference().toSourceString()
             + "` went from not overriding a library method to overriding a library method";
     assert isLibraryMethodOverride.isPossiblyTrue()
             || this.isLibraryMethodOverride.isPossiblyFalse()
         : "Method `"
-            + method.toSourceString()
+            + getReference().toSourceString()
             + "` went from overriding a library method to not overriding a library method";
     this.isLibraryMethodOverride = isLibraryMethodOverride;
   }
 
   public boolean isProgramMethod(DexDefinitionSupplier definitions) {
-    if (method.holder.isClassType()) {
-      DexClass clazz = definitions.definitionFor(method.holder);
+    if (getReference().holder.isClassType()) {
+      DexClass clazz = definitions.definitionFor(getReference().holder);
       return clazz != null && clazz.isProgramClass();
     }
     return false;
@@ -444,8 +442,8 @@
   }
 
   public DexClassAndMethod asDexClassAndMethod(DexDefinitionSupplier definitions) {
-    assert method.holder.isClassType();
-    DexClass clazz = definitions.definitionForHolder(method);
+    assert getReference().holder.isClassType();
+    DexClass clazz = definitions.definitionForHolder(getReference());
     if (clazz != null) {
       return DexClassAndMethod.create(clazz, this);
     }
@@ -453,8 +451,8 @@
   }
 
   public ProgramMethod asProgramMethod(DexDefinitionSupplier definitions) {
-    assert method.holder.isClassType();
-    DexProgramClass clazz = asProgramClassOrNull(definitions.definitionForHolder(method));
+    assert getReference().holder.isClassType();
+    DexProgramClass clazz = asProgramClassOrNull(definitions.definitionForHolder(getReference()));
     if (clazz != null) {
       return new ProgramMethod(clazz, this);
     }
@@ -530,7 +528,7 @@
 
   public boolean isDefaultInitializer() {
     checkIfObsolete();
-    return isInstanceInitializer() && method.proto.parameters.isEmpty();
+    return isInstanceInitializer() && getReference().proto.parameters.isEmpty();
   }
 
   public boolean isClassInitializer() {
@@ -698,28 +696,28 @@
         return true;
 
       case PROCESSED_INLINING_CANDIDATE_SUBCLASS:
-        if (appInfo.isSubtype(containerType, method.holder)) {
+        if (appInfo.isSubtype(containerType, getReference().holder)) {
           return true;
         }
         whyAreYouNotInliningReporter.reportCallerNotSubtype();
         return false;
 
       case PROCESSED_INLINING_CANDIDATE_SAME_PACKAGE:
-        if (containerType.isSamePackage(method.holder)) {
+        if (containerType.isSamePackage(getReference().holder)) {
           return true;
         }
         whyAreYouNotInliningReporter.reportCallerNotSamePackage();
         return false;
 
       case PROCESSED_INLINING_CANDIDATE_SAME_NEST:
-        if (NestUtils.sameNest(containerType, method.holder, appInfo)) {
+        if (NestUtils.sameNest(containerType, getReference().holder, appInfo)) {
           return true;
         }
         whyAreYouNotInliningReporter.reportCallerNotSameNest();
         return false;
 
       case PROCESSED_INLINING_CANDIDATE_SAME_CLASS:
-        if (containerType == method.holder) {
+        if (containerType == getReference().holder) {
           return true;
         }
         whyAreYouNotInliningReporter.reportCallerNotSameClass();
@@ -808,7 +806,7 @@
   @Override
   public String toString() {
     checkIfObsolete();
-    return "Encoded method " + method;
+    return "Encoded method " + getReference();
   }
 
   @Override
@@ -869,7 +867,7 @@
 
   public String qualifiedName() {
     checkIfObsolete();
-    return method.qualifiedName();
+    return getReference().qualifiedName();
   }
 
   public String descriptor() {
@@ -881,11 +879,11 @@
     checkIfObsolete();
     StringBuilder builder = new StringBuilder();
     builder.append("(");
-    for (DexType type : method.proto.parameters.values) {
+    for (DexType type : getReference().proto.parameters.values) {
       builder.append(namingLens.lookupDescriptor(type).toString());
     }
     builder.append(")");
-    builder.append(namingLens.lookupDescriptor(method.proto.returnType).toString());
+    builder.append(namingLens.lookupDescriptor(getReference().proto.returnType).toString());
     return builder.toString();
   }
 
@@ -903,8 +901,8 @@
     builder.append(".method ");
     builder.append(accessFlags.toSmaliString());
     builder.append(" ");
-    builder.append(method.name.toSmaliString());
-    builder.append(method.proto.toSmaliString());
+    builder.append(getReference().name.toSmaliString());
+    builder.append(getReference().proto.toSmaliString());
     builder.append("\n");
     if (code != null) {
       DexCode dexCode = code.asDexCode();
@@ -920,7 +918,7 @@
   @Override
   public String toSourceString() {
     checkIfObsolete();
-    return method.toSourceString();
+    return getReference().toSourceString();
   }
 
   public DexEncodedMethod toAbstractMethod() {
@@ -946,7 +944,7 @@
       offset += instruction.getSize();
     }
     int requiredArgRegisters = accessFlags.isStatic() ? 0 : 1;
-    for (DexType type : method.proto.parameters.values) {
+    for (DexType type : getReference().proto.parameters.values) {
       requiredArgRegisters += ValueType.fromDexType(type).requiredRegisters();
     }
     return new DexCode(
@@ -998,7 +996,7 @@
   }
 
   public CfCode buildEmptyThrowingCfCode() {
-    return buildEmptyThrowingCfCode(method);
+    return buildEmptyThrowingCfCode(getReference());
   }
 
   public static CfCode buildEmptyThrowingCfCode(DexMethod method) {
@@ -1034,9 +1032,9 @@
     }
     instructions[i] = new CfReturn(ValueType.INT);
     return new CfCode(
-        method.holder,
+        getReference().holder,
         1 + BooleanUtils.intValue(negate),
-        method.getArity() + 1,
+        getReference().getArity() + 1,
         Arrays.asList(instructions),
         Collections.emptyList(),
         Collections.emptyList());
@@ -1076,10 +1074,13 @@
   
   private DexEncodedMethod toMethodThatLogsErrorDexCode(DexItemFactory itemFactory) {
     checkIfObsolete();
-    Signature signature = MethodSignature.fromDexMethod(method);
+    Signature signature = MethodSignature.fromDexMethod(getReference());
     DexString message =
         itemFactory.createString(
-            CONFIGURATION_DEBUGGING_PREFIX + method.holder.toSourceString() + ": " + signature);
+            CONFIGURATION_DEBUGGING_PREFIX
+                + getReference().holder.toSourceString()
+                + ": "
+                + signature);
     DexString tag = itemFactory.createString("[R8]");
     DexType[] args = {itemFactory.stringType, itemFactory.stringType};
     DexProto proto = itemFactory.createProto(itemFactory.intType, args);
@@ -1110,10 +1111,13 @@
 
   private DexEncodedMethod toMethodThatLogsErrorCfCode(DexItemFactory itemFactory) {
     checkIfObsolete();
-    Signature signature = MethodSignature.fromDexMethod(method);
+    Signature signature = MethodSignature.fromDexMethod(getReference());
     DexString message =
         itemFactory.createString(
-            CONFIGURATION_DEBUGGING_PREFIX + method.holder.toSourceString() + ": " + signature);
+            CONFIGURATION_DEBUGGING_PREFIX
+                + getReference().holder.toSourceString()
+                + ": "
+                + signature);
     DexString tag = itemFactory.createString("[R8]");
     DexType logger = itemFactory.javaUtilLoggingLoggerType;
     DexMethod getLogger =
@@ -1132,7 +1136,7 @@
             exceptionType,
             itemFactory.createProto(itemFactory.voidType, itemFactory.stringType),
             itemFactory.constructorMethodName);
-    int locals = method.proto.parameters.size() + 1;
+    int locals = getReference().proto.parameters.size() + 1;
     if (!isStaticMember()) {
       // Consider `this` pointer
       locals++;
@@ -1152,7 +1156,7 @@
         .add(new CfThrow());
     CfCode code =
         new CfCode(
-            method.holder,
+            getReference().holder,
             3,
             locals,
             instructionBuilder.build(),
@@ -1171,7 +1175,7 @@
 
   public DexEncodedMethod toTypeSubstitutedMethod(DexMethod method, Consumer<Builder> consumer) {
     checkIfObsolete();
-    if (this.method == method) {
+    if (this.getReference() == method) {
       return this;
     }
     Builder builder = builder(this);
@@ -1243,7 +1247,7 @@
 
   public DexEncodedMethod toRenamedHolderMethod(DexType newHolderType, DexItemFactory factory) {
     DexEncodedMethod.Builder builder = DexEncodedMethod.builder(this);
-    builder.setMethod(method.withHolder(newHolderType, factory));
+    builder.setMethod(getReference().withHolder(newHolderType, factory));
     return builder.build();
   }
 
@@ -1318,7 +1322,7 @@
 
   public DexEncodedMethod toForwardingMethod(
       DexClass newHolder, DexDefinitionSupplier definitions) {
-    DexMethod newMethod = method.withHolder(newHolder, definitions.dexItemFactory());
+    DexMethod newMethod = getReference().withHolder(newHolder, definitions.dexItemFactory());
     checkIfObsolete();
 
     // Clear the final flag, as this method is now overwritten. Do this before creating the builder
@@ -1347,13 +1351,17 @@
                                         .setStaticSource(newMethod)
                                         .setStaticTarget(
                                             getReference(),
-                                            method.getHolderType().isInterface(definitions)),
+                                            getReference()
+                                                .getHolderType()
+                                                .isInterface(definitions)),
                                 codeBuilder ->
                                     codeBuilder
                                         .setNonStaticSource(newMethod)
                                         .setSuperTarget(
                                             getReference(),
-                                            method.getHolderType().isInterface(definitions)))
+                                            getReference()
+                                                .getHolderType()
+                                                .isInterface(definitions)))
                             .build())
                     .modifyAccessFlags(MethodAccessFlags::setBridge))
         .build();
@@ -1435,7 +1443,7 @@
   }
 
   public MethodPosition getPosition() {
-    return new MethodPosition(method.asMethodReference());
+    return new MethodPosition(getReference().asMethodReference());
   }
 
   @Override
@@ -1456,7 +1464,7 @@
   }
 
   public static int slowCompare(DexEncodedMethod m1, DexEncodedMethod m2) {
-    return m1.method.compareTo(m2.method);
+    return m1.getReference().compareTo(m2.getReference());
   }
 
   public MethodOptimizationInfo getOptimizationInfo() {
@@ -1543,7 +1551,7 @@
 
     private Builder(DexEncodedMethod from, boolean d8R8Synthesized) {
       // Copy all the mutable state of a DexEncodedMethod here.
-      method = from.method;
+      method = from.getReference();
       accessFlags = from.accessFlags.copy();
       genericSignature = from.getGenericSignature();
       annotations = from.annotations();
diff --git a/src/main/java/com/android/tools/r8/graph/DexField.java b/src/main/java/com/android/tools/r8/graph/DexField.java
index ef99d01..fd2c110 100644
--- a/src/main/java/com/android/tools/r8/graph/DexField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexField.java
@@ -175,7 +175,7 @@
 
   @Override
   public boolean match(DexEncodedField encodedField) {
-    return match(encodedField.field);
+    return match(encodedField.getReference());
   }
 
   public String qualifiedName() {
diff --git a/src/main/java/com/android/tools/r8/graph/DexMethod.java b/src/main/java/com/android/tools/r8/graph/DexMethod.java
index 8484a94..c96dc4a 100644
--- a/src/main/java/com/android/tools/r8/graph/DexMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexMethod.java
@@ -223,7 +223,7 @@
 
   @Override
   public boolean match(DexEncodedMethod encodedMethod) {
-    return match(encodedMethod.method);
+    return match(encodedMethod.getReference());
   }
 
   public String qualifiedName() {
diff --git a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
index a4ccb8e..881b0e9 100644
--- a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
@@ -559,7 +559,8 @@
       return null;
     }
     DexEncodedField[] fields = staticFields;
-    Arrays.sort(fields, (a, b) -> a.field.compareToWithNamingLens(b.field, namingLens));
+    Arrays.sort(
+        fields, (a, b) -> a.getReference().compareToWithNamingLens(b.getReference(), namingLens));
     int length = 0;
     List<DexValue> values = new ArrayList<>(fields.length);
     for (int i = 0; i < fields.length; i++) {
@@ -567,7 +568,7 @@
       DexValue staticValue = field.getStaticValue();
       assert staticValue != null;
       values.add(staticValue);
-      if (!staticValue.isDefault(field.field.type)) {
+      if (!staticValue.isDefault(field.getReference().type)) {
         length = i + 1;
       }
     }
@@ -579,7 +580,7 @@
   private boolean hasNonDefaultStaticFieldValues() {
     for (DexEncodedField field : staticFields) {
       DexValue value = field.getStaticValue();
-      if (value != null && !value.isDefault(field.field.type)) {
+      if (value != null && !value.isDefault(field.getReference().type)) {
         return true;
       }
     }
diff --git a/src/main/java/com/android/tools/r8/graph/GraphLens.java b/src/main/java/com/android/tools/r8/graph/GraphLens.java
index e5c349c..3912ae6 100644
--- a/src/main/java/com/android/tools/r8/graph/GraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/GraphLens.java
@@ -334,7 +334,7 @@
       DexDefinitionSupplier definitions,
       GraphLens applied) {
     assert originalEncodedMethod != DexEncodedMethod.SENTINEL;
-    DexMethod newMethod = getRenamedMethodSignature(originalEncodedMethod.method, applied);
+    DexMethod newMethod = getRenamedMethodSignature(originalEncodedMethod.getReference(), applied);
     // Note that:
     // * Even if `newMethod` is the same as `originalEncodedMethod.method`, we still need to look it
     //   up, since `originalEncodedMethod` may be obsolete.
@@ -602,10 +602,10 @@
     Set<DexMethod> originalMethods = Sets.newIdentityHashSet();
     for (DexProgramClass clazz : originalApplication.classes()) {
       for (DexEncodedField field : clazz.fields()) {
-        originalFields.add(field.field);
+        originalFields.add(field.getReference());
       }
       for (DexEncodedMethod method : clazz.methods()) {
-        originalMethods.add(method.method);
+        originalMethods.add(method.getReference());
       }
     }
 
@@ -631,7 +631,7 @@
           // Methods synthesized by D8/R8 may not be mapped.
           continue;
         }
-        DexMethod originalMethod = getOriginalMethodSignature(method.method);
+        DexMethod originalMethod = getOriginalMethodSignature(method.getReference());
         assert originalMethods.contains(originalMethod);
       }
     }
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index d8815c7..4def125 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -510,9 +510,9 @@
         throw new CompilationError(message, origin);
       }
       for (DexEncodedField instanceField : instanceFields) {
-        if (!recordComponents.contains(instanceField.field)) {
+        if (!recordComponents.contains(instanceField.getReference())) {
           throw new CompilationError(
-              message + " Unmatched field " + instanceField.field + ".", origin);
+              message + " Unmatched field " + instanceField.getReference() + ".", origin);
         }
       }
     }
diff --git a/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java b/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java
index 3c7b2d8..4a99071 100644
--- a/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java
+++ b/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java
@@ -34,7 +34,7 @@
       if (pinnedMethods == null) {
         pinnedMethods = Sets.newIdentityHashSet();
       }
-      pinnedMethods.add(method.method);
+      pinnedMethods.add(method.getReference());
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/MethodArrayBacking.java b/src/main/java/com/android/tools/r8/graph/MethodArrayBacking.java
index 7c38464..17072ef 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodArrayBacking.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodArrayBacking.java
@@ -26,8 +26,8 @@
     Set<DexMethod> unique = Sets.newIdentityHashSet();
     forEachMethod(
         method -> {
-          boolean changed = unique.add(method.method);
-          assert changed : "Duplicate method `" + method.method.toSourceString() + "`";
+          boolean changed = unique.add(method.getReference());
+          assert changed : "Duplicate method `" + method.getReference().toSourceString() + "`";
         });
     return true;
   }
diff --git a/src/main/java/com/android/tools/r8/graph/MethodCollection.java b/src/main/java/com/android/tools/r8/graph/MethodCollection.java
index ccf33aa..35e0541 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodCollection.java
@@ -137,7 +137,7 @@
   public List<DexEncodedMethod> allMethodsSorted() {
     List<DexEncodedMethod> sorted = new ArrayList<>(size());
     forEachMethod(sorted::add);
-    sorted.sort((a, b) -> a.method.compareTo(b.method));
+    sorted.sort((a, b) -> a.getReference().compareTo(b.getReference()));
     return sorted;
   }
 
@@ -344,7 +344,7 @@
   private boolean verifyCorrectnessOfMethodHolder(DexEncodedMethod method) {
     assert method.getHolderType() == holder.type
         : "Expected method `"
-            + method.method.toSourceString()
+            + method.getReference().toSourceString()
             + "` to have holder `"
             + holder.type.toSourceString()
             + "`";
diff --git a/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java b/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java
index f3385af..a7d3c45 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java
@@ -57,7 +57,7 @@
       methodMap.put(existingKey, method);
     } else {
       methodMap.remove(existingKey);
-      methodMap.put(wrap(method.method), method);
+      methodMap.put(wrap(method.getReference()), method);
     }
   }
 
@@ -165,7 +165,7 @@
 
   @Override
   void addMethod(DexEncodedMethod method) {
-    Wrapper<DexMethod> key = wrap(method.method);
+    Wrapper<DexMethod> key = wrap(method.getReference());
     DexEncodedMethod old = methodMap.put(key, method);
     assert old == null;
   }
@@ -229,12 +229,12 @@
     forEachMethod(
         method -> {
           if (belongsToVirtualPool(method)) {
-            newMap.put(wrap(method.method), method);
+            newMap.put(wrap(method.getReference()), method);
           }
         });
     for (DexEncodedMethod method : methods) {
       assert belongsToDirectPool(method);
-      newMap.put(wrap(method.method), method);
+      newMap.put(wrap(method.getReference()), method);
     }
     methodMap = newMap;
   }
@@ -252,12 +252,12 @@
     forEachMethod(
         method -> {
           if (belongsToDirectPool(method)) {
-            newMap.put(wrap(method.method), method);
+            newMap.put(wrap(method.getReference()), method);
           }
         });
     for (DexEncodedMethod method : methods) {
       assert belongsToVirtualPool(method);
-      newMap.put(wrap(method.method), method);
+      newMap.put(wrap(method.getReference()), method);
     }
     methodMap = newMap;
   }
@@ -271,7 +271,7 @@
     for (DexEncodedMethod method : initialValues) {
       DexEncodedMethod newMethod = replacement.apply(method);
       if (newMethod != method) {
-        removeMethod(method.method);
+        removeMethod(method.getReference());
         addMethod(newMethod);
       }
     }
@@ -359,7 +359,7 @@
   private boolean verifyVirtualizedMethods(Set<DexEncodedMethod> methods) {
     for (DexEncodedMethod method : methods) {
       assert belongsToVirtualPool(method);
-      assert methodMap.get(wrap(method.method)) == method;
+      assert methodMap.get(wrap(method.getReference())) == method;
     }
     return true;
   }
diff --git a/src/main/java/com/android/tools/r8/graph/ResolutionResult.java b/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
index 041033e..d846788 100644
--- a/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
@@ -346,7 +346,7 @@
         return null;
       }
       // 1-3. Search the initial class and its supers in order for a matching instance method.
-      DexMethod method = getResolvedMethod().method;
+      DexMethod method = getResolvedMethod().getReference();
       DexClassAndMethod target = null;
       DexClass current = initialType;
       while (current != null) {
@@ -446,7 +446,7 @@
       return LookupResult.createResult(
           methodTargets,
           lambdaTargets,
-          incompleteness.computeCollectionState(resolvedMethod.method, appInfo));
+          incompleteness.computeCollectionState(resolvedMethod.getReference(), appInfo));
     }
 
     @Override
@@ -626,12 +626,12 @@
 
     private DexClassAndMethod lookupMaximallySpecificDispatchTarget(
         DexClass dynamicInstance, AppInfoWithClassHierarchy appInfo) {
-      return appInfo.lookupMaximallySpecificMethod(dynamicInstance, resolvedMethod.method);
+      return appInfo.lookupMaximallySpecificMethod(dynamicInstance, resolvedMethod.getReference());
     }
 
     private DexClassAndMethod lookupMaximallySpecificDispatchTarget(
         LambdaDescriptor lambdaDescriptor, AppInfoWithClassHierarchy appInfo) {
-      return appInfo.lookupMaximallySpecificMethod(lambdaDescriptor, resolvedMethod.method);
+      return appInfo.lookupMaximallySpecificMethod(lambdaDescriptor, resolvedMethod.getReference());
     }
 
     /**
@@ -642,7 +642,7 @@
      */
     private static DexEncodedMethod lookupOverrideCandidate(
         DexEncodedMethod method, DexClass clazz) {
-      DexEncodedMethod candidate = clazz.lookupVirtualMethod(method.method);
+      DexEncodedMethod candidate = clazz.lookupVirtualMethod(method.getReference());
       assert candidate == null || !candidate.isPrivateMethod();
       if (candidate != null) {
         return isOverriding(method, candidate) ? candidate : DexEncodedMethod.SENTINEL;
@@ -659,7 +659,7 @@
         if (clazz == null) {
           return resolvedMethod;
         }
-        DexEncodedMethod otherOverride = clazz.lookupVirtualMethod(resolvedMethod.method);
+        DexEncodedMethod otherOverride = clazz.lookupVirtualMethod(resolvedMethod.getReference());
         if (otherOverride != null
             && isOverriding(resolvedMethod, otherOverride)
             && (otherOverride.accessFlags.isPublic() || otherOverride.accessFlags.isProtected())) {
@@ -680,7 +680,7 @@
      */
     public static boolean isOverriding(
         DexEncodedMethod resolvedMethod, DexEncodedMethod candidate) {
-      assert resolvedMethod.method.match(candidate.method);
+      assert resolvedMethod.getReference().match(candidate.getReference());
       assert !candidate.isPrivateMethod();
       if (resolvedMethod.accessFlags.isPublic() || resolvedMethod.accessFlags.isProtected()) {
         return true;
diff --git a/src/main/java/com/android/tools/r8/graph/RewrittenPrototypeDescription.java b/src/main/java/com/android/tools/r8/graph/RewrittenPrototypeDescription.java
index add54d6..131ca4e 100644
--- a/src/main/java/com/android/tools/r8/graph/RewrittenPrototypeDescription.java
+++ b/src/main/java/com/android/tools/r8/graph/RewrittenPrototypeDescription.java
@@ -252,7 +252,7 @@
       // Currently not allowed to remove the receiver of an instance method. This would involve
       // changing invoke-direct/invoke-virtual into invoke-static.
       assert encodedMethod.isStatic() || !getArgumentInfo(0).isRemovedArgumentInfo();
-      DexType[] params = encodedMethod.method.proto.parameters.values;
+      DexType[] params = encodedMethod.getReference().proto.parameters.values;
       if (isEmpty()) {
         return params;
       }
@@ -433,12 +433,12 @@
 
   public DexProto rewriteProto(DexEncodedMethod encodedMethod, DexItemFactory dexItemFactory) {
     if (isEmpty()) {
-      return encodedMethod.method.proto;
+      return encodedMethod.getReference().proto;
     }
     DexType newReturnType =
         rewrittenReturnInfo != null
             ? rewrittenReturnInfo.newType
-            : encodedMethod.method.proto.returnType;
+            : encodedMethod.getReference().proto.returnType;
     DexType[] newParameters = argumentInfoCollection.rewriteParameters(encodedMethod);
     return dexItemFactory.createProto(newReturnType, newParameters);
   }
diff --git a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
index 27f3251..5bbc1ee 100644
--- a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
+++ b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
@@ -43,7 +43,7 @@
   }
 
   private DexEncodedField recordFieldChange(DexEncodedField from, DexEncodedField to) {
-    recordFieldChange(from.field, to.field);
+    recordFieldChange(from.getReference(), to.getReference());
     return to;
   }
 
@@ -77,7 +77,7 @@
 
   /** Callback to allow custom handling when an encoded method changes. */
   public DexEncodedMethod recordMethodChange(DexEncodedMethod from, DexEncodedMethod to) {
-    recordMethodChange(from.method, to.method);
+    recordMethodChange(from.getReference(), to.getReference());
     return to;
   }
 
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
index 131198c..a47acd6 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
@@ -167,7 +167,7 @@
   DexMethod renameDirectMethod(ProgramMethod method) {
     assert method.getDefinition().belongsToDirectPool();
     return dexItemFactory.createFreshMethodName(
-        method.getDefinition().method.name.toSourceString(),
+        method.getDefinition().getReference().name.toSourceString(),
         method.getHolderType(),
         method.getDefinition().getProto(),
         group.getTarget().getType(),
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
index e8130ed..c144128 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
@@ -112,7 +112,7 @@
     flags.setPrivate();
     classMethodsBuilder.addDirectMethod(encodedMethod);
 
-    return encodedMethod.method;
+    return encodedMethod.getReference();
   }
 
   private MethodAccessFlags getAccessFlags() {
diff --git a/src/main/java/com/android/tools/r8/inspector/internal/FieldInspectorImpl.java b/src/main/java/com/android/tools/r8/inspector/internal/FieldInspectorImpl.java
index 056d652e..c7e0cbb 100644
--- a/src/main/java/com/android/tools/r8/inspector/internal/FieldInspectorImpl.java
+++ b/src/main/java/com/android/tools/r8/inspector/internal/FieldInspectorImpl.java
@@ -26,8 +26,8 @@
       reference =
           Reference.field(
               parent.getClassReference(),
-              field.field.name.toString(),
-              Reference.typeFromDescriptor(field.field.type.toDescriptorString()));
+              field.getReference().name.toString(),
+              Reference.typeFromDescriptor(field.getReference().type.toDescriptorString()));
     }
     return reference;
   }
@@ -45,7 +45,7 @@
   @Override
   public Optional<ValueInspector> getInitialValue() {
     if (field.isStatic() && field.getStaticValue() != null) {
-      return Optional.of(new ValueInspectorImpl(field.getStaticValue(), field.field.type));
+      return Optional.of(new ValueInspectorImpl(field.getStaticValue(), field.getReference().type));
     }
     return Optional.empty();
   }
diff --git a/src/main/java/com/android/tools/r8/inspector/internal/MethodInspectorImpl.java b/src/main/java/com/android/tools/r8/inspector/internal/MethodInspectorImpl.java
index 1d868be..3c27924 100644
--- a/src/main/java/com/android/tools/r8/inspector/internal/MethodInspectorImpl.java
+++ b/src/main/java/com/android/tools/r8/inspector/internal/MethodInspectorImpl.java
@@ -27,14 +27,14 @@
       reference =
           Reference.method(
               parent.getClassReference(),
-              method.method.name.toString(),
+              method.getReference().name.toString(),
               ListUtils.map(
-                  Arrays.asList(method.method.proto.parameters.values),
+                  Arrays.asList(method.getReference().proto.parameters.values),
                   param -> Reference.typeFromDescriptor(param.toDescriptorString())),
-              method.method.proto.returnType.isVoidType()
+              method.getReference().proto.returnType.isVoidType()
                   ? null
                   : Reference.typeFromDescriptor(
-                      method.method.proto.returnType.toDescriptorString()));
+                      method.getReference().proto.returnType.toDescriptorString()));
     }
     return reference;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/TypeChecker.java b/src/main/java/com/android/tools/r8/ir/analysis/TypeChecker.java
index 5926ecc..b2b6111 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/TypeChecker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/TypeChecker.java
@@ -72,7 +72,8 @@
     }
     TypeElement valueType = instruction.returnValue().getType();
     TypeElement returnType =
-        TypeElement.fromDexType(method.method.proto.returnType, Nullability.maybeNull(), appView);
+        TypeElement.fromDexType(
+            method.getReference().proto.returnType, Nullability.maybeNull(), appView);
     if (verifyTypesHelper.isAssignable(valueType, returnType)) {
       return true;
     }
@@ -80,7 +81,7 @@
     if (returnType.isClassType() && valueType.isReferenceType()) {
       // Interface types are treated like Object according to the JVM spec.
       // https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.10.1.2-100
-      DexClass clazz = appView.definitionFor(method.method.proto.returnType);
+      DexClass clazz = appView.definitionFor(method.getReference().proto.returnType);
       return clazz != null && clazz.isInterface();
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
index ccef272..d1b411a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
@@ -102,7 +102,7 @@
           Map<DexEncodedField, AbstractValue> abstractInstanceFieldValuesForClass =
               new IdentityHashMap<>();
           for (DexEncodedField field : clazz.instanceFields()) {
-            FieldAccessInfo fieldAccessInfo = fieldAccessInfos.get(field.field);
+            FieldAccessInfo fieldAccessInfo = fieldAccessInfos.get(field.getReference());
             if (fieldAccessInfo != null && !fieldAccessInfo.hasReflectiveAccess()) {
               abstractInstanceFieldValuesForClass.put(field, BottomValue.getInstance());
             }
@@ -112,14 +112,14 @@
   }
 
   private boolean isAlwaysZero(DexEncodedField field) {
-    return !appView.appInfo().isPinned(field.field) && !nonZeroFields.contains(field);
+    return !appView.appInfo().isPinned(field.getReference()) && !nonZeroFields.contains(field);
   }
 
   void acceptClassInitializerDefaultsResult(
       ClassInitializerDefaultsResult classInitializerDefaultsResult) {
     classInitializerDefaultsResult.forEachOptimizedField(
         (field, value) -> {
-          if (!value.isDefault(field.field.type)) {
+          if (!value.isDefault(field.getReference().type)) {
             nonZeroFields.add(field);
           }
         });
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessAnalysis.java
index a178a69..a1e3eb5 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessAnalysis.java
@@ -17,7 +17,7 @@
 
   public void recordFieldAccess(
       FieldInstruction instruction, DexEncodedField field, OptimizationFeedback feedback) {
-    if (!field.field.type.isIntType()) {
+    if (!field.getReference().type.isIntType()) {
       return;
     }
 
@@ -79,7 +79,7 @@
     }
     if (user.isFieldPut()) {
       FieldInstruction fieldInstruction = user.asFieldInstruction();
-      if (fieldInstruction.getField() == encodedField.field) {
+      if (fieldInstruction.getField() == encodedField.getReference()) {
         return true;
       }
     }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
index 05259ca..b11431e 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
@@ -134,7 +134,7 @@
   private void clearReadsAndWritesFromFieldsOfInterest(AppInfoWithLiveness appInfo) {
     FieldAccessInfoCollection<?> fieldAccessInfoCollection = appInfo.getFieldAccessInfoCollection();
     for (DexEncodedField field : constantFields) {
-      fieldAccessInfoCollection.get(field.field).asMutable().clearReads();
+      fieldAccessInfoCollection.get(field.getReference()).asMutable().clearReads();
     }
     for (DexEncodedField field : readFields.keySet()) {
       fieldAccessInfoCollection.get(field.getReference()).asMutable().clearWrites();
@@ -165,7 +165,7 @@
   private static FieldClassification classifyField(
       DexEncodedField field, AppView<AppInfoWithLiveness> appView) {
     FieldAccessInfo fieldAccessInfo =
-        appView.appInfo().getFieldAccessInfoCollection().get(field.field);
+        appView.appInfo().getFieldAccessInfoCollection().get(field.getReference());
     if (fieldAccessInfo == null
         || fieldAccessInfo.hasReflectiveAccess()
         || fieldAccessInfo.isAccessedFromMethodHandle()
@@ -184,7 +184,7 @@
       if (singleValue.isSingleFieldValue()) {
         SingleFieldValue singleFieldValue = singleValue.asSingleFieldValue();
         DexField singleField = singleFieldValue.getField();
-        if (singleField != field.field
+        if (singleField != field.getReference()
             && !singleFieldValue.mayHaveFinalizeMethodDirectlyOrIndirectly(appView)) {
           return FieldClassification.CONSTANT;
         }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/ConcreteMutableFieldSet.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/ConcreteMutableFieldSet.java
index 5bf0c61..f84e13d 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/ConcreteMutableFieldSet.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/ConcreteMutableFieldSet.java
@@ -73,7 +73,7 @@
     assert !isEmpty();
     ConcreteMutableFieldSet rewrittenSet = new ConcreteMutableFieldSet();
     for (DexEncodedField field : fields) {
-      DexField rewrittenFieldReference = lens.lookupField(field.field);
+      DexField rewrittenFieldReference = lens.lookupField(field.getReference());
       DexClass holder = appView.definitionForHolder(rewrittenFieldReference);
       DexEncodedField rewrittenField = rewrittenFieldReference.lookupOnClass(holder);
       if (rewrittenField == null) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValueAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValueAnalysis.java
index fc01602..13d03d5 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValueAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValueAnalysis.java
@@ -150,7 +150,7 @@
 
     // Dynamic upper bound type.
     TypeElement fieldType =
-        TypeElement.fromDexType(field.field.type, Nullability.maybeNull(), appView);
+        TypeElement.fromDexType(field.getReference().type, Nullability.maybeNull(), appView);
     TypeElement dynamicUpperBoundType = value.getDynamicUpperBoundType(appView);
     if (dynamicUpperBoundType.strictlyLessThan(fieldType, appView)) {
       if (maybeNull && dynamicUpperBoundType.isDefinitelyNotNull()) {
@@ -201,7 +201,7 @@
     }
     return appView
         .abstractValueFactory()
-        .createSingleFieldValue(field.field, computeObjectState(value));
+        .createSingleFieldValue(field.getReference(), computeObjectState(value));
   }
 
   /**
@@ -330,7 +330,7 @@
 
     return appView
         .abstractValueFactory()
-        .createSingleFieldValue(valuesField.field, new EnumValuesObjectState(valuesState));
+        .createSingleFieldValue(valuesField.getReference(), new EnumValuesObjectState(valuesState));
   }
 
   private ObjectState computeEnumInstanceObjectState(Value value) {
@@ -428,7 +428,7 @@
 
     return appView
         .abstractValueFactory()
-        .createSingleFieldValue(enumField.field, computeObjectState(value));
+        .createSingleFieldValue(enumField.getReference(), computeObjectState(value));
   }
 
   private ObjectState computeObjectState(Value value) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValues.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValues.java
index 65e1ea3..ec51f91 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValues.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValues.java
@@ -63,11 +63,13 @@
             assert valuesCandidateAbstractValue == null
                 || valuesCandidateAbstractValue.equals(value);
             valuesCandidateAbstractValue = value;
-            enumObjectStateBuilder.put(staticField.field, value.asSingleFieldValue().getState());
+            enumObjectStateBuilder.put(
+                staticField.getReference(), value.asSingleFieldValue().getState());
           }
         } else if (factory.enumMembers.isEnumField(staticField, staticField.getHolderType())) {
           if (value.isSingleFieldValue() && !value.asSingleFieldValue().getState().isEmpty()) {
-            enumObjectStateBuilder.put(staticField.field, value.asSingleFieldValue().getState());
+            enumObjectStateBuilder.put(
+                staticField.getReference(), value.asSingleFieldValue().getState());
           }
         }
       }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/EnumLiteProtoShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/EnumLiteProtoShrinker.java
index 64f5bea..f0e63e9 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/EnumLiteProtoShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/EnumLiteProtoShrinker.java
@@ -113,7 +113,7 @@
     }
     DexType enumLiteCandidate = null;
     for (DexEncodedMethod virtualMethod : enumLiteMap.virtualMethods()) {
-      if (!matchesFindValueByNumberMethod(virtualMethod.method)) {
+      if (!matchesFindValueByNumberMethod(virtualMethod.getReference())) {
         return null;
       }
       if (virtualMethod.returnType() == references.enumLiteType) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
index f15ad69..3cb884a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
@@ -109,7 +109,8 @@
         @Override
         public boolean isReachableOrReferencedField(
             AppInfoWithLiveness appInfo, DexEncodedField field) {
-          return !wasRemoved(field.field) && super.isReachableOrReferencedField(appInfo, field);
+          return !wasRemoved(field.getReference())
+              && super.isReachableOrReferencedField(appInfo, field);
         }
       };
     }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteBuilderShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteBuilderShrinker.java
index c5f72a3..da0ed41 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteBuilderShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteBuilderShrinker.java
@@ -440,9 +440,9 @@
         if (clazz != null) {
           DexEncodedMethod newBuilderMethod =
               clazz.lookupDirectMethod(
-                  method -> method.method.name == references.newBuilderMethodName);
+                  method -> method.getReference().name == references.newBuilderMethodName);
           if (newBuilderMethod != null) {
-            bypassClinitforInlining.add(newBuilderMethod.method);
+            bypassClinitforInlining.add(newBuilderMethod.getReference());
           }
         }
       }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnumSwitchMapRemover.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnumSwitchMapRemover.java
index 5c3692c..f8c2bf0 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnumSwitchMapRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnumSwitchMapRemover.java
@@ -64,7 +64,8 @@
       return null;
     }
     ObjectState state =
-        enumStaticFieldValues.getObjectStateForPossiblyPinnedField(enumInstanceField.field);
+        enumStaticFieldValues.getObjectStateForPossiblyPinnedField(
+            enumInstanceField.getReference());
     if (state == null) {
       return null;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoReferences.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoReferences.java
index b25f946..030fe3d 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoReferences.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoReferences.java
@@ -147,7 +147,7 @@
   }
 
   public boolean isDynamicMethod(DexEncodedMethod encodedMethod) {
-    return isDynamicMethod(encodedMethod.method);
+    return isDynamicMethod(encodedMethod.getReference());
   }
 
   public boolean isDynamicMethod(ProgramMethod method) {
@@ -160,7 +160,7 @@
   }
 
   public boolean isDynamicMethodBridge(DexEncodedMethod method) {
-    return isDynamicMethodBridge(method.method);
+    return isDynamicMethodBridge(method.getReference());
   }
 
   public boolean isDynamicMethodBridge(ProgramMethod method) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/NonEmptyObjectState.java b/src/main/java/com/android/tools/r8/ir/analysis/value/NonEmptyObjectState.java
index 6aacc3d..567449e 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/NonEmptyObjectState.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/NonEmptyObjectState.java
@@ -31,7 +31,7 @@
 
   @Override
   public AbstractValue getAbstractFieldValue(DexEncodedField field) {
-    return state.getOrDefault(field.field, UnknownValue.getInstance());
+    return state.getOrDefault(field.getReference(), UnknownValue.getInstance());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/ObjectState.java b/src/main/java/com/android/tools/r8/ir/analysis/value/ObjectState.java
index 4db63a6..012a204 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/ObjectState.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/ObjectState.java
@@ -70,8 +70,8 @@
 
     public void recordFieldHasValue(DexEncodedField field, AbstractValue abstractValue) {
       if (!abstractValue.isUnknown()) {
-        assert !state.containsKey(field.field);
-        state.put(field.field, abstractValue);
+        assert !state.containsKey(field.getReference());
+        state.put(field.getReference(), abstractValue);
       }
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java b/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java
index fa42fcd..6c773a6 100644
--- a/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java
@@ -113,7 +113,7 @@
       // Only check for <clinit> side effects if there is no -assumenosideeffects rule.
       if (appView.appInfo().hasLiveness()) {
         AppInfoWithLiveness appInfoWithLiveness = appView.appInfo().withLiveness();
-        if (appInfoWithLiveness.noSideEffects.containsKey(resolvedField.field)) {
+        if (appInfoWithLiveness.noSideEffects.containsKey(resolvedField.getReference())) {
           return false;
         }
       }
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index 0995f34..202df23 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -1091,7 +1091,7 @@
       }
     }
     assert arguments.size()
-        == method().method.getArity()
+        == method().getReference().getArity()
             + ((method().accessFlags.isStatic() || ignoreReceiver) ? 0 : 1);
     return arguments;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
index 39f2aee..ae02e8b 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
@@ -185,7 +185,7 @@
             .appInfo()
             .resolveMethodOnClass(dexItemFactory.objectMembers.finalize, clazz);
     if (finalizeResolutionResult.isSingleResolution()) {
-      DexMethod finalizeMethod = finalizeResolutionResult.getSingleTarget().method;
+      DexMethod finalizeMethod = finalizeResolutionResult.getSingleTarget().getReference();
       if (finalizeMethod != dexItemFactory.enumMembers.finalize
           && finalizeMethod != dexItemFactory.objectMembers.finalize) {
         return true;
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
index 1017f53..9b68a81 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
@@ -111,7 +111,7 @@
 
       boolean isDeadProtoExtensionField =
           appView.withGeneratedExtensionRegistryShrinker(
-              shrinker -> shrinker.isDeadProtoExtensionField(encodedField.field), false);
+              shrinker -> shrinker.isDeadProtoExtensionField(encodedField.getReference()), false);
       if (isDeadProtoExtensionField) {
         return false;
       }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilder.java
index e6f7cb6..4be3d83 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilder.java
@@ -38,7 +38,7 @@
   boolean verifyAllMethodsWithCodeExists() {
     for (DexProgramClass clazz : appView.appInfo().classes()) {
       for (DexEncodedMethod method : clazz.methods()) {
-        assert method.hasCode() == (nodes.get(method.method) != null);
+        assert method.hasCode() == (nodes.get(method.getReference()) != null);
       }
     }
     return true;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
index 967fee0..32be662 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
@@ -195,7 +195,7 @@
 
     private void processInvokeWithDynamicDispatch(
         Invoke.Type type, DexEncodedMethod encodedTarget, ProgramMethod context) {
-      DexMethod target = encodedTarget.method;
+      DexMethod target = encodedTarget.getReference();
       DexClass clazz = appView.definitionFor(target.holder);
       if (clazz == null) {
         assert false : "Unable to lookup holder of `" + target.toSourceString() + "`";
@@ -258,7 +258,7 @@
       }
 
       DexEncodedField encodedField = appView.appInfo().resolveField(field).getResolvedField();
-      if (encodedField == null || appView.appInfo().isPinned(encodedField.field)) {
+      if (encodedField == null || appView.appInfo().isPinned(encodedField.getReference())) {
         return;
       }
 
@@ -273,7 +273,7 @@
         addClassInitializerTarget(clazz);
       }
 
-      FieldAccessInfo fieldAccessInfo = fieldAccessInfoCollection.get(encodedField.field);
+      FieldAccessInfo fieldAccessInfo = fieldAccessInfoCollection.get(encodedField.getReference());
       if (fieldAccessInfo != null && fieldAccessInfo.hasKnownWriteContexts()) {
         if (fieldAccessInfo.getNumberOfWriteContexts() == 1) {
           fieldAccessInfo.forEachWriteContext(this::addFieldReadEdge);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
index 8a63d63..682ca02 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
@@ -187,7 +187,7 @@
   public DexField resolveField(DexField field) {
     DexEncodedField resolvedField =
         appView.appInfoForDesugaring().resolveField(field).getResolvedField();
-    return resolvedField == null ? field : resolvedField.field;
+    return resolvedField == null ? field : resolvedField.getReference();
   }
 
   private void computeInitializers() {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index 93c61ab..321c96c 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -542,7 +542,7 @@
     }
 
     int originalNumberOfArguments =
-        method.method.proto.parameters.values.length
+        method.getReference().proto.parameters.values.length
             + argumentsInfo.numberOfRemovedArguments()
             + (method.isStatic() ? 0 : 1)
             - prototypeChanges.numberOfExtraParameters();
@@ -562,14 +562,14 @@
         DexType argType;
         if (argumentInfo.isRewrittenTypeInfo()) {
           RewrittenTypeInfo argumentRewrittenTypeInfo = argumentInfo.asRewrittenTypeInfo();
-          assert method.method.proto.getParameter(usedArgumentIndex)
+          assert method.getReference().proto.getParameter(usedArgumentIndex)
               == argumentRewrittenTypeInfo.getNewType();
           // The old type is used to prevent that a changed value from reference to primitive
           // type breaks IR building. Rewriting from the old to the new type will be done in the
           // IRConverter (typically through the lensCodeRewriter).
           argType = argumentRewrittenTypeInfo.getOldType();
         } else {
-          argType = method.method.proto.getParameter(usedArgumentIndex);
+          argType = method.getReference().proto.getParameter(usedArgumentIndex);
         }
         usedArgumentIndex++;
         writeCallback.accept(register, argType);
@@ -585,7 +585,7 @@
     }
 
     for (ExtraParameter extraParameter : prototypeChanges.getExtraParameters()) {
-      DexType argType = method.method.proto.getParameter(usedArgumentIndex);
+      DexType argType = method.getReference().proto.getParameter(usedArgumentIndex);
       TypeElement type = extraParameter.getTypeElement(appView, argType);
       register += type.requiredRegisters();
       usedArgumentIndex++;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 54b0a66..0530046 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -1196,7 +1196,7 @@
             + ExceptionUtils.getMainStackTrace();
     assert !method.isProcessed()
             || !appView.enableWholeProgramOptimizations()
-            || !appView.appInfo().withLiveness().isNeverReprocessMethod(method.method)
+            || !appView.appInfo().withLiveness().isNeverReprocessMethod(method.getReference())
         : "Illegal reprocessing due to -neverreprocess rule: " + context.toSourceString();
 
     if (typeChecker != null && !typeChecker.check(code)) {
@@ -1621,7 +1621,7 @@
       timing.end();
     }
 
-    if (appView.appInfo().withLiveness().isPinned(code.method().method)) {
+    if (appView.appInfo().withLiveness().isPinned(code.method().getReference())) {
       return;
     }
 
@@ -1785,7 +1785,7 @@
       return;
     }
     // Only constructors with certain signatures.
-    DexTypeList paramTypes = code.method().method.proto.parameters;
+    DexTypeList paramTypes = code.method().getReference().proto.parameters;
     if (paramTypes.size() != 3 ||
         paramTypes.values[0] != options.itemFactory.doubleType ||
         paramTypes.values[1] != options.itemFactory.doubleType ||
@@ -1967,7 +1967,7 @@
       printer.end("cfg");
     }
     if (options.extensiveLoggingFilter.size() > 0
-        && options.extensiveLoggingFilter.contains(code.method().method.toSourceString())) {
+        && options.extensiveLoggingFilter.contains(code.method().getReference().toSourceString())) {
       String current = code.toString();
       System.out.println();
       System.out.println("-----------------------------------------------------------------------");
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index b6609b8..6ccaf0f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -596,7 +596,7 @@
               if (ret.isReturnVoid()) {
                 break;
               }
-              DexType returnType = code.method().method.proto.returnType;
+              DexType returnType = code.method().getReference().proto.returnType;
               Value retValue = ret.returnValue();
               DexType initialType =
                   retValue.getType().isPrimitiveType()
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java b/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java
index 4c073e1..d9f8625 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/TypeConstraintResolver.java
@@ -152,7 +152,7 @@
                       + ", its imprecise type is: "
                       + stillImprecise.get(0).getType(),
                   code.origin,
-                  new MethodPosition(code.method().method.asMethodReference())));
+                  new MethodPosition(code.method().getReference().asMethodReference())));
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
index 6200603..630a67d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
@@ -384,7 +384,7 @@
     Set<Wrapper<DexMethod>> defaultMethods =
         new HashSet<>(iface.getMethodCollection().numberOfVirtualMethods());
     for (DexEncodedMethod method : iface.virtualMethods(DexEncodedMethod::isDefaultMethod)) {
-      defaultMethods.add(equivalence.wrap(method.method));
+      defaultMethods.add(equivalence.wrap(method.getReference()));
     }
     return MethodSignatures.create(defaultMethods);
   }
@@ -644,7 +644,7 @@
           "Attempt to add forwarding method that conflicts with existing method.",
           null,
           clazz.getOrigin(),
-          new MethodPosition(methodOnSelf.method.asMethodReference()));
+          new MethodPosition(methodOnSelf.getReference().asMethodReference()));
     }
 
     // NOTE: Never add a forwarding method to methods of classes unknown or coming from android.jar
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
index fd4abda..5760bd2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
@@ -267,7 +267,7 @@
 
   private static boolean hasVirtualMethodWithSignature(DexClass clazz, DexEncodedMethod method) {
     for (DexEncodedMethod existingMethod : clazz.virtualMethods()) {
-      if (existingMethod.method.equals(method.method)) {
+      if (existingMethod.getReference().equals(method.getReference())) {
         return true;
       }
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DefaultMethodsHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/DefaultMethodsHelper.java
index 07277bc..838374d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DefaultMethodsHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DefaultMethodsHelper.java
@@ -44,7 +44,7 @@
     DexMethod getSingleCandidate(DexMethod method) {
       DexMethod candidate = null;
       for (DexEncodedMethod encodedMethod : live) {
-        DexMethod current = encodedMethod.method;
+        DexMethod current = encodedMethod.getReference();
         if (current.proto == method.proto && current.name == method.name) {
           if (candidate != null) {
             return null;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
index f2f255a..4f05b2e 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
@@ -341,10 +341,10 @@
   private ProgramMethod generateCallbackMethod(
       DexEncodedMethod originalMethod, DexProgramClass clazz) {
     DexMethod methodToInstall =
-        methodWithVivifiedTypeInSignature(originalMethod.method, clazz.type, appView);
+        methodWithVivifiedTypeInSignature(originalMethod.getReference(), clazz.type, appView);
     CfCode cfCode =
         new APIConverterWrapperCfCodeProvider(
-                appView, originalMethod.method, null, this, clazz.isInterface())
+                appView, originalMethod.getReference(), null, this, clazz.isInterface())
             .generateCfCode();
     DexEncodedMethod newMethod =
         wrapperSynthesizor.newSynthesizedMethod(methodToInstall, originalMethod, cfCode);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryRetargeter.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryRetargeter.java
index 8a6624e..4f4673a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryRetargeter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryRetargeter.java
@@ -264,7 +264,7 @@
     if (!appView.options().encodeChecksums) {
       return DexProgramClass::invalidChecksumRequest;
     }
-    return c -> method.method.hashCode();
+    return c -> method.getReference().hashCode();
   }
 
   // Used by the ListOfBackportedMethods utility.
@@ -331,7 +331,7 @@
       }
       DexEncodedMethod singleTarget = resolutionResult.getSingleTarget();
       assert singleTarget != null;
-      retarget = getRetargetLibraryMember(singleTarget.method);
+      retarget = getRetargetLibraryMember(singleTarget.getReference());
     }
     return retarget;
   }
@@ -622,7 +622,8 @@
         // Dispatch holder.
         DexType holderType = dispatchHolderTypeFor(emulatedDispatchMethod);
         DexEncodedMethod dispatchMethod =
-            generateHolderDispatchMethod(emulatedDispatchMethod, holderType, itfMethod.method);
+            generateHolderDispatchMethod(
+                emulatedDispatchMethod, holderType, itfMethod.getReference());
         synthesizeClassWithUniqueMethod(
             builder,
             holderAccessFlags,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
index ce4f61a..f5845d4 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
@@ -239,7 +239,9 @@
         DexAnnotationSet.empty(),
         DexEncodedField.EMPTY_ARRAY, // No static fields.
         new DexEncodedField[] {wrapperField},
-        new DexEncodedMethod[] {synthesizeConstructor(wrapperField.field), conversionMethod},
+        new DexEncodedMethod[] {
+          synthesizeConstructor(wrapperField.getReference()), conversionMethod
+        },
         virtualMethods,
         factory.getSkipNameValidationForTesting(),
         DexProgramClass::checksumFromType);
@@ -275,21 +277,17 @@
       DexMethod methodToInstall =
           factory.createMethod(
               wrapperField.getHolderType(),
-              dexEncodedMethod.method.proto,
-              dexEncodedMethod.method.name);
+              dexEncodedMethod.getReference().proto,
+              dexEncodedMethod.getReference().name);
       CfCode cfCode;
       if (dexEncodedMethod.isFinal()) {
         invalidWrappers.add(wrapperField.getHolderType());
-        finalMethods.add(dexEncodedMethod.method);
+        finalMethods.add(dexEncodedMethod.getReference());
         continue;
       } else {
         cfCode =
             new APIConverterVivifiedWrapperCfCodeProvider(
-                    appView,
-                    methodToInstall,
-                    wrapperField.field,
-                    converter,
-                isInterface)
+                    appView, methodToInstall, wrapperField.getReference(), converter, isInterface)
                 .generateCfCode();
       }
       DexEncodedMethod newDexEncodedMethod =
@@ -320,16 +318,20 @@
       boolean isInterface = holderClass == null || holderClass.isInterface();
       DexMethod methodToInstall =
           DesugaredLibraryAPIConverter.methodWithVivifiedTypeInSignature(
-              dexEncodedMethod.method, wrapperField.getHolderType(), appView);
+              dexEncodedMethod.getReference(), wrapperField.getHolderType(), appView);
       CfCode cfCode;
       if (dexEncodedMethod.isFinal()) {
         invalidWrappers.add(wrapperField.getHolderType());
-        finalMethods.add(dexEncodedMethod.method);
+        finalMethods.add(dexEncodedMethod.getReference());
         continue;
       } else {
         cfCode =
             new APIConverterWrapperCfCodeProvider(
-                    appView, dexEncodedMethod.method, wrapperField.field, converter, isInterface)
+                    appView,
+                    dexEncodedMethod.getReference(),
+                    wrapperField.getReference(),
+                    converter,
+                    isInterface)
                 .generateCfCode();
       }
       DexEncodedMethod newDexEncodedMethod =
@@ -398,7 +400,7 @@
           // This looks quadratic but given the size of the collections met in practice for
           // desugared libraries (Max ~15) it does not matter.
           for (DexEncodedMethod alreadyImplementedMethod : implementedMethods) {
-            if (alreadyImplementedMethod.method.match(virtualMethod.method)) {
+            if (alreadyImplementedMethod.getReference().match(virtualMethod.getReference())) {
               alreadyAdded = true;
               break;
             }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
index a1c0d58..0ed24b2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
@@ -198,8 +198,10 @@
       clazz.forEachMethod(
           m -> {
             if (m.isDefaultMethod()) {
-              appInfo.dexItemFactory().registerTypeNeededForDesugaring(m.method.proto.returnType);
-              for (DexType param : m.method.proto.parameters.values) {
+              appInfo
+                  .dexItemFactory()
+                  .registerTypeNeededForDesugaring(m.getReference().proto.returnType);
+              for (DexType param : m.getReference().proto.parameters.values) {
                 appInfo.dexItemFactory().registerTypeNeededForDesugaring(param);
               }
             }
@@ -216,7 +218,7 @@
       if (emulatedInterfaceClass != null) {
         for (DexEncodedMethod encodedMethod :
             emulatedInterfaceClass.methods(DexEncodedMethod::isDefaultMethod)) {
-          emulatedMethods.add(encodedMethod.method.name);
+          emulatedMethods.add(encodedMethod.getReference().name);
         }
       }
     }
@@ -1476,7 +1478,7 @@
 
     // Hide by virtual methods of this interface.
     for (DexEncodedMethod virtual : definedInterface.virtualMethods()) {
-      helper.hideMatches(virtual.method);
+      helper.hideMatches(virtual.getReference());
     }
 
     // Add all default methods of this interface.
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
index d20eee7..9c65847 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
@@ -256,7 +256,8 @@
         implMethod.copyMetadata(virtual);
         virtual.setDefaultInterfaceMethodImplementation(implMethod);
         companionMethods.add(implMethod);
-        graphLensBuilder.recordCodeMovedToCompanionClass(method.getReference(), implMethod.method);
+        graphLensBuilder.recordCodeMovedToCompanionClass(
+            method.getReference(), implMethod.getReference());
       }
 
       // Remove bridge methods.
@@ -397,7 +398,7 @@
   // also be kept (such a situation can happen if the vertical class merger merges two interfaces).
   private boolean interfaceMethodRemovalChangesApi(DexEncodedMethod method, DexClass iface) {
     if (appView.enableWholeProgramOptimizations()) {
-      if (appView.appInfo().withLiveness().isPinned(method.method)) {
+      if (appView.appInfo().withLiveness().isPinned(method.getReference())) {
         return true;
       }
     }
@@ -411,7 +412,7 @@
         if (clazz == null || !seenBefore.add(clazz.type)) {
           continue;
         }
-        if (clazz.lookupVirtualMethod(method.method) != null) {
+        if (clazz.lookupVirtualMethod(method.getReference()) != null) {
           return false;
         }
         addSuperTypes(clazz, worklist);
@@ -433,7 +434,8 @@
     if (method.accessFlags.isNative()) {
       throw new Unimplemented("Native interface methods are not yet supported.");
     }
-    return method.accessFlags.isStatic() && !rewriter.factory.isClassConstructor(method.method);
+    return method.accessFlags.isStatic()
+        && !rewriter.factory.isClassConstructor(method.getReference());
   }
 
   // Specific lens which remaps invocation types to static since all rewrites performed here
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index d54264c..a264d65 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -575,7 +575,7 @@
                             true);
                     newMethod.copyMetadata(encodedMethod);
                     forcefullyMovedLambdaMethodConsumer.acceptForcefullyMovedLambdaMethod(
-                        encodedMethod.method, callTarget);
+                        encodedMethod.getReference(), callTarget);
 
                     DexEncodedMethod.setDebugInfoWithFakeThisParameter(
                         newMethod.getCode(), callTarget.getArity(), appView);
@@ -659,7 +659,7 @@
                             true);
                     newMethod.copyMetadata(encodedMethod);
                     forcefullyMovedLambdaMethodConsumer.acceptForcefullyMovedLambdaMethod(
-                        encodedMethod.method, callTarget);
+                        encodedMethod.getReference(), callTarget);
                     return newMethod;
                   });
       if (replacement != null) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ArgumentRemovalUtils.java b/src/main/java/com/android/tools/r8/ir/optimize/ArgumentRemovalUtils.java
index 28bbf14..8f9421d 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ArgumentRemovalUtils.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ArgumentRemovalUtils.java
@@ -13,10 +13,10 @@
   // Returns true if this method is pinned from the perspective of optimizations that attempt to
   // remove method arguments.
   public static boolean isPinned(DexEncodedMethod method, AppView<AppInfoWithLiveness> appView) {
-    return appView.appInfo().isPinned(method.method)
-        || appView.appInfo().isBootstrapMethod(method.method)
-        || appView.appInfo().isFailedResolutionTarget(method.method)
-        || appView.appInfo().isMethodTargetedByInvokeDynamic(method.method)
+    return appView.appInfo().isPinned(method.getReference())
+        || appView.appInfo().isBootstrapMethod(method.getReference())
+        || appView.appInfo().isFailedResolutionTarget(method.getReference())
+        || appView.appInfo().isMethodTargetedByInvokeDynamic(method.getReference())
         || method.accessFlags.isNative();
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java b/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java
index 5eb23bb..43be45b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java
@@ -384,12 +384,13 @@
         }
       }
     }
-    assert argumentsSeen == code.method().method.getArity() + (code.method().isStatic() ? 0 : 1)
+    assert argumentsSeen
+            == code.method().getReference().getArity() + (code.method().isStatic() ? 0 : 1)
         : "args: "
             + argumentsSeen
             + " != "
             + "arity: "
-            + code.method().method.getArity()
+            + code.method().getReference().getArity()
             + ", static: "
             + code.method().isStatic();
     // After packed Argument instructions, add Assume and constant instructions.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java b/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java
index b176db1..3551295 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ClassInitializerDefaultsOptimization.java
@@ -164,7 +164,7 @@
     // Set initial values for static fields from the definitive static put instructions collected.
     finalFieldPuts.forEach(
         (field, put) -> {
-          DexType fieldType = field.field.type;
+          DexType fieldType = field.getReference().type;
           Value value = put.value().getAliasedValue();
           if (unnecessaryStaticPuts.contains(put)) {
             if (fieldType == dexItemFactory.stringType) {
@@ -253,7 +253,7 @@
                 .map(appInfoWithLiveness::resolveField)
                 .map(FieldResolutionResult::getResolvedField)
                 .filter(appInfoWithLiveness::isStaticFieldWrittenOnlyInEnclosingStaticInitializer)
-                .map(field -> field.field)
+                .map(field -> field.getReference())
                 .collect(Collectors.toSet());
 
         // Then retain only these fields that are actually no longer being written to.
@@ -264,7 +264,7 @@
             DexEncodedField encodedField =
                 appInfoWithLiveness.resolveField(field).getResolvedField();
             if (encodedField != null) {
-              candidates.remove(encodedField.field);
+              candidates.remove(encodedField.getReference());
             }
           }
         }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index d3dc297..32ec969 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -263,7 +263,7 @@
           if (appView
               .dexItemFactory()
               .objectsMethods
-              .isRequireNonNullMethod(code.method().method)) {
+              .isRequireNonNullMethod(code.method().getReference())) {
             continue;
           }
 
@@ -524,7 +524,8 @@
     int selfRecursionFanOut = 0;
     Instruction lastSelfRecursiveCall = null;
     for (Instruction i : code.instructions()) {
-      if (i.isInvokeMethod() && i.asInvokeMethod().getInvokedMethod() == code.method().method) {
+      if (i.isInvokeMethod()
+          && i.asInvokeMethod().getInvokedMethod() == code.method().getReference()) {
         selfRecursionFanOut++;
         lastSelfRecursiveCall = i;
       }
@@ -3720,7 +3721,7 @@
     InstructionListIterator iterator = block.listIterator(code);
 
     // Attach some synthetic position to all inserted code.
-    Position position = Position.synthetic(1, method.method, null);
+    Position position = Position.synthetic(1, method.getReference(), null);
     iterator.setInsertionPosition(position);
 
     // Split arguments into their own block.
@@ -3748,7 +3749,7 @@
     Value value = addConstString(code, iterator, "INVOKE ");
     iterator.add(new InvokeVirtual(print, null, ImmutableList.of(out, value)));
 
-    value = addConstString(code, iterator, method.method.qualifiedName());
+    value = addConstString(code, iterator, method.getReference().qualifiedName());
     iterator.add(new InvokeVirtual(print, null, ImmutableList.of(out, value)));
 
     Value openParenthesis = addConstString(code, iterator, "(");
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java b/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
index fa3886e..0cc7497 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
@@ -387,7 +387,7 @@
     }
 
     // Change the invoke-virtual instruction to target the refined resolution result instead.
-    return newResolutionResult.getResolvedMethod().method;
+    return newResolutionResult.getResolvedMethod().getReference();
   }
 
   private boolean isRebindingNewClassIntoMainDex(ProgramMethod context, DexMethod reboundMethod) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DynamicTypeOptimization.java b/src/main/java/com/android/tools/r8/ir/optimize/DynamicTypeOptimization.java
index 20e0515..9b738b6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DynamicTypeOptimization.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DynamicTypeOptimization.java
@@ -30,7 +30,7 @@
    * <p>If the method has no normal exits, then null is returned.
    */
   public TypeElement computeDynamicReturnType(DexEncodedMethod method, IRCode code) {
-    assert method.method.proto.returnType.isReferenceType();
+    assert method.getReference().proto.returnType.isReferenceType();
     List<TypeElement> returnedTypes = new ArrayList<>();
     for (BasicBlock block : code.blocks) {
       JumpInstruction exitInstruction = block.exit();
@@ -43,7 +43,7 @@
   }
 
   public ClassTypeElement computeDynamicLowerBoundType(DexEncodedMethod method, IRCode code) {
-    assert method.method.proto.returnType.isReferenceType();
+    assert method.getReference().proto.returnType.isReferenceType();
     ClassTypeElement result = null;
     for (BasicBlock block : code.blocks) {
       JumpInstruction exitInstruction = block.exit();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/MethodPoolCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/MethodPoolCollection.java
index 74a4324..652c185 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/MethodPoolCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/MethodPoolCollection.java
@@ -58,7 +58,7 @@
       clazz.forEachMethod(
           encodedMethod -> {
             if (methodTester.test(encodedMethod)) {
-              methodPool.seen(equivalence.wrap(encodedMethod.method));
+              methodPool.seen(equivalence.wrap(encodedMethod.getReference()));
             }
           });
       if (clazz.superType != null) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadElimination.java b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadElimination.java
index f802efe..014337c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadElimination.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadElimination.java
@@ -363,14 +363,14 @@
     fieldInitializationInfos.forEachWithDeterministicOrder(
         appView,
         (field, info) -> {
-          if (!appView.appInfo().withLiveness().mayPropagateValueFor(field.field)) {
+          if (!appView.appInfo().withLiveness().mayPropagateValueFor(field.getReference())) {
             return;
           }
           if (info.isArgumentInitializationInfo()) {
             Value value =
                 invoke.getArgument(info.asArgumentInitializationInfo().getArgumentIndex());
             Value object = invoke.getReceiver().getAliasedValue();
-            FieldAndObject fieldAndObject = new FieldAndObject(field.field, object);
+            FieldAndObject fieldAndObject = new FieldAndObject(field.getReference(), object);
             if (field.isFinal()) {
               activeState.putFinalInstanceField(fieldAndObject, new ExistingValue(value));
             } else {
@@ -380,7 +380,7 @@
             SingleValue value = info.asSingleValue();
             if (value.isMaterializableInContext(appView.withLiveness(), method)) {
               Value object = invoke.getReceiver().getAliasedValue();
-              FieldAndObject fieldAndObject = new FieldAndObject(field.field, object);
+              FieldAndObject fieldAndObject = new FieldAndObject(field.getReference(), object);
               if (field.isFinal()) {
                 activeState.putFinalInstanceField(fieldAndObject, new MaterializableValue(value));
               } else {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
index 6758593..d532b9b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
@@ -178,7 +178,7 @@
               });
 
       new Rewriter(code, instructionIterator, serviceLoaderLoad)
-          .perform(classLoaderInvoke, synthesizedMethod.method);
+          .perform(classLoaderInvoke, synthesizedMethod.getReference());
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
index 7bec65e..5536f0e 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
@@ -100,7 +100,7 @@
   }
 
   private void extractSwitchMap(DexEncodedField encodedField, IRCode initializer) {
-    DexField field = encodedField.field;
+    DexField field = encodedField.getReference();
     Int2ReferenceMap<DexField> switchMap = new Int2ReferenceArrayMap<>();
 
     // Find each array-put instruction that updates an entry of the array that is stored in
@@ -162,7 +162,7 @@
 
   private boolean maybeIsSwitchMap(DexEncodedField dexEncodedField) {
     // We are looking for synthetic fields of type int[].
-    DexField field = dexEncodedField.field;
+    DexField field = dexEncodedField.getReference();
     return dexEncodedField.accessFlags.isSynthetic()
         && (field.name.startsWith(switchMapPrefix) || field.name.startsWith(kotlinSwitchMapPrefix))
         && field.type == intArrayType;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java b/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java
index d60ba25..3e58a94 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java
@@ -158,7 +158,7 @@
       for (DexEncodedMethod virtualMethod : clazz.virtualMethods()) {
         RewrittenPrototypeDescription prototypeChanges =
             RewrittenPrototypeDescription.createForUninstantiatedTypes(
-                virtualMethod.method,
+                virtualMethod.getReference(),
                 appView,
                 getRemovedArgumentsInfo(virtualMethod, ALLOW_ARGUMENT_REMOVAL));
         if (!prototypeChanges.isEmpty()) {
@@ -186,7 +186,7 @@
     Set<Wrapper<DexMethod>> usedSignatures = new HashSet<>();
     for (DexEncodedMethod method : clazz.methods()) {
       if (!prototypeChangesPerMethod.containsKey(method)) {
-        usedSignatures.add(equivalence.wrap(method.method));
+        usedSignatures.add(equivalence.wrap(method.getReference()));
       }
     }
 
@@ -195,7 +195,7 @@
         .getMethodCollection()
         .replaceDirectMethods(
             encodedMethod -> {
-              DexMethod method = encodedMethod.method;
+              DexMethod method = encodedMethod.getReference();
               RewrittenPrototypeDescription prototypeChanges =
                   prototypeChangesPerMethod.getOrDefault(
                       encodedMethod, RewrittenPrototypeDescription.none());
@@ -230,7 +230,7 @@
         .getMethodCollection()
         .replaceVirtualMethods(
             encodedMethod -> {
-              DexMethod method = encodedMethod.method;
+              DexMethod method = encodedMethod.getReference();
               RewrittenPrototypeDescription prototypeChanges =
                   getPrototypeChanges(encodedMethod, DISALLOW_ARGUMENT_REMOVAL);
               ArgumentInfoCollection removedArgumentsInfo =
@@ -262,7 +262,7 @@
         .getMethodCollection()
         .replaceVirtualMethods(
             encodedMethod -> {
-              DexMethod method = encodedMethod.method;
+              DexMethod method = encodedMethod.getReference();
               RewrittenPrototypeDescription prototypeChanges =
                   getPrototypeChanges(encodedMethod, DISALLOW_ARGUMENT_REMOVAL);
               ArgumentInfoCollection removedArgumentsInfo =
@@ -299,11 +299,11 @@
   private RewrittenPrototypeDescription getPrototypeChanges(
       DexEncodedMethod encodedMethod, Strategy strategy) {
     if (ArgumentRemovalUtils.isPinned(encodedMethod, appView)
-        || appView.appInfo().isKeepConstantArgumentsMethod(encodedMethod.method)) {
+        || appView.appInfo().isKeepConstantArgumentsMethod(encodedMethod.getReference())) {
       return RewrittenPrototypeDescription.none();
     }
     return RewrittenPrototypeDescription.createForUninstantiatedTypes(
-        encodedMethod.method, appView, getRemovedArgumentsInfo(encodedMethod, strategy));
+        encodedMethod.getReference(), appView, getRemovedArgumentsInfo(encodedMethod, strategy));
   }
 
   private ArgumentInfoCollection getRemovedArgumentsInfo(
@@ -313,7 +313,7 @@
     }
 
     ArgumentInfoCollection.Builder argInfosBuilder = ArgumentInfoCollection.builder();
-    DexProto proto = encodedMethod.method.proto;
+    DexProto proto = encodedMethod.getReference().proto;
     int offset = encodedMethod.isStatic() ? 0 : 1;
     for (int i = 0; i < proto.parameters.size(); ++i) {
       DexType type = proto.parameters.values[i];
@@ -329,7 +329,7 @@
   private DexMethod getNewMethodSignature(
       DexEncodedMethod encodedMethod, RewrittenPrototypeDescription prototypeChanges) {
     DexItemFactory dexItemFactory = appView.dexItemFactory();
-    DexMethod method = encodedMethod.method;
+    DexMethod method = encodedMethod.getReference();
     DexProto newProto = prototypeChanges.rewriteProto(encodedMethod, dexItemFactory);
 
     return dexItemFactory.createMethod(method.holder, newProto, method.name);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/UnusedArgumentsCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/UnusedArgumentsCollector.java
index ec1b904..0ebf96b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/UnusedArgumentsCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/UnusedArgumentsCollector.java
@@ -133,8 +133,8 @@
       DexString newName = null;
       do {
         if (newName == null) {
-          newName = method.method.name;
-        } else if (!appView.dexItemFactory().isConstructor(method.method)) {
+          newName = method.getReference().name;
+        } else if (!appView.dexItemFactory().isConstructor(method.getReference())) {
           newName =
               appView
                   .dexItemFactory()
@@ -142,7 +142,7 @@
                       SymbolGenerationUtils.numberToIdentifier(
                           count,
                           MixedCasing.USE_MIXED_CASE,
-                          method.method.name.toSourceString().toCharArray()));
+                          method.getReference().name.toSourceString().toCharArray()));
         } else {
           // Constructors must be named `<init>`.
           return null;
@@ -156,7 +156,7 @@
 
     DexEncodedMethod removeArguments(
         DexEncodedMethod method, DexMethod newSignature, ArgumentInfoCollection unused) {
-      boolean removed = usedSignatures.remove(equivalence.wrap(method.method));
+      boolean removed = usedSignatures.remove(equivalence.wrap(method.getReference()));
       assert removed;
 
       markSignatureAsUsed(newSignature);
@@ -180,10 +180,12 @@
       DexString newName = null;
       do {
         if (newName == null) {
-          newName = method.method.name;
-        } else if (!appView.dexItemFactory().isConstructor(method.method)) {
+          newName = method.getReference().name;
+        } else if (!appView.dexItemFactory().isConstructor(method.getReference())) {
           newName =
-              appView.dexItemFactory().createString(method.method.name.toSourceString() + count);
+              appView
+                  .dexItemFactory()
+                  .createString(method.getReference().name.toSourceString() + count);
         } else {
           // Constructors must be named `<init>`.
           return null;
@@ -210,7 +212,7 @@
   private void processDirectMethods(DexProgramClass clazz) {
     UsedSignatures signatures = new UsedSignatures();
     for (DexEncodedMethod method : clazz.methods()) {
-      signatures.markSignatureAsUsed(method.method);
+      signatures.markSignatureAsUsed(method.getReference());
     }
 
     clazz
@@ -220,7 +222,7 @@
 
               // If this is a method with known resolution issues, then don't remove any unused
               // arguments.
-              if (appView.appInfo().isFailedResolutionTarget(method.method)) {
+              if (appView.appInfo().isFailedResolutionTarget(method.getReference())) {
                 return method;
               }
 
@@ -229,14 +231,14 @@
                 DexProto newProto = createProtoWithRemovedArguments(method, unused);
                 DexMethod newSignature = signatures.getNewSignature(method, newProto);
                 if (newSignature == null) {
-                  assert appView.dexItemFactory().isConstructor(method.method);
+                  assert appView.dexItemFactory().isConstructor(method.getReference());
                   return method;
                 }
                 DexEncodedMethod newMethod =
                     signatures.removeArguments(method, newSignature, unused);
                 synchronized (this) {
-                  methodMapping.put(method.method, newMethod.method);
-                  removedArguments.put(newMethod.method, unused);
+                  methodMapping.put(method.getReference(), newMethod.getReference());
+                  removedArguments.put(newMethod.getReference(), unused);
                 }
                 return newMethod;
               }
@@ -265,8 +267,8 @@
                     signatures.removeArguments(
                         method, signatures.getNewSignature(method, newProto), unused);
 
-                methodMapping.put(method.method, newMethod.method);
-                removedArguments.put(newMethod.method, unused);
+                methodMapping.put(method.getReference(), newMethod.getReference());
+                removedArguments.put(newMethod.getReference(), unused);
                 return newMethod;
               }
               return method;
@@ -280,7 +282,7 @@
   private ArgumentInfoCollection collectUnusedArguments(
       DexEncodedMethod method, MemberPool<DexMethod> methodPool) {
     if (ArgumentRemovalUtils.isPinned(method, appView)
-        || appView.appInfo().isKeepUnusedArgumentsMethod(method.method)) {
+        || appView.appInfo().isKeepUnusedArgumentsMethod(method.getReference())) {
       return null;
     }
     // Only process classfile code objects.
@@ -292,13 +294,13 @@
       // an unused argument cannot be removed unless it is unused in all of the related methods in
       // the hierarchy.
       assert methodPool != null;
-      Wrapper<DexMethod> wrapper = equivalence.wrap(method.method);
+      Wrapper<DexMethod> wrapper = equivalence.wrap(method.getReference());
       if (methodPool.hasSeenStrictlyAbove(wrapper) || methodPool.hasSeenStrictlyBelow(wrapper)) {
         return null;
       }
     }
     int offset = method.accessFlags.isStatic() ? 0 : 1;
-    int argumentCount = method.method.proto.parameters.size() + offset;
+    int argumentCount = method.getReference().proto.parameters.size() + offset;
     CollectUsedArguments collector = new CollectUsedArguments();
     if (!method.accessFlags.isStatic()) {
       // TODO(65810338): The receiver cannot be removed without transforming the method to being
@@ -313,7 +315,7 @@
         if (!used.get(argumentIndex)) {
           RemovedArgumentInfo removedArg =
               RemovedArgumentInfo.builder()
-                  .setType(method.method.proto.parameters.values[argumentIndex - offset])
+                  .setType(method.getReference().proto.parameters.values[argumentIndex - offset])
                   .build();
           argInfosBuilder.addArgumentInfo(argumentIndex, removedArg);
         }
@@ -326,7 +328,9 @@
   private DexProto createProtoWithRemovedArguments(
       DexEncodedMethod encodedMethod, ArgumentInfoCollection unused) {
     DexType[] parameters = unused.rewriteParameters(encodedMethod);
-    return appView.dexItemFactory().createProto(encodedMethod.method.proto.returnType, parameters);
+    return appView
+        .dexItemFactory()
+        .createProto(encodedMethod.getReference().proto.returnType, parameters);
   }
 
   private static class CollectUsedArguments extends ArgumentUse {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java
index 4857999..f7b79aa 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java
@@ -290,8 +290,8 @@
     // Class must not define finalizer.
     DexItemFactory dexItemFactory = appView.dexItemFactory();
     for (DexEncodedMethod method : clazz.virtualMethods()) {
-      if (method.method.name == dexItemFactory.finalizeMethodName
-          && method.method.proto == dexItemFactory.objectMembers.finalize.proto) {
+      if (method.getReference().name == dexItemFactory.finalizeMethodName
+          && method.getReference().proto == dexItemFactory.objectMembers.finalize.proto) {
         return EligibilityStatus.NOT_ELIGIBLE;
       }
     }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
index 27deb32..ce781ec 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
@@ -341,7 +341,7 @@
           eligibleEnums.add(type);
         }
       } else if (use.isReturn()) {
-        DexType returnType = code.method().method.proto.returnType;
+        DexType returnType = code.method().getReference().proto.returnType;
         if (enumUnboxingCandidatesInfo.isCandidate(returnType)) {
           eligibleEnums.add(returnType);
         }
@@ -500,7 +500,7 @@
     for (DexEncodedField staticField : enumClass.staticFields()) {
       if (factory.enumMembers.isEnumField(staticField, enumClass.type)) {
         ObjectState enumState =
-            enumStaticFieldValues.getObjectStateForPossiblyPinnedField(staticField.field);
+            enumStaticFieldValues.getObjectStateForPossiblyPinnedField(staticField.getReference());
         if (enumState == null) {
           if (staticField.getOptimizationInfo().isDead()) {
             // We don't care about unused field data.
@@ -514,11 +514,11 @@
           return null;
         }
         int ordinal = optionalOrdinal.getAsInt();
-        unboxedValues.put(staticField.field, ordinalToUnboxedInt(ordinal));
+        unboxedValues.put(staticField.getReference(), ordinalToUnboxedInt(ordinal));
         ordinalToObjectState.put(ordinal, enumState);
       } else if (factory.enumMembers.isValuesFieldCandidate(staticField, enumClass.type)) {
         ObjectState valuesState =
-            enumStaticFieldValues.getObjectStateForPossiblyPinnedField(staticField.field);
+            enumStaticFieldValues.getObjectStateForPossiblyPinnedField(staticField.getReference());
         if (valuesState == null) {
           if (staticField.getOptimizationInfo().isDead()) {
             // We don't care about unused field data.
@@ -533,7 +533,7 @@
         assert valuesContents == null
             || valuesContents.equals(valuesState.asEnumValuesObjectState());
         valuesContents = valuesState.asEnumValuesObjectState();
-        valuesField.add(staticField.field);
+        valuesField.add(staticField.getReference());
       }
     }
 
@@ -1012,7 +1012,7 @@
         return Reason.ELIGIBLE;
       }
       // The put value has to be of the field type.
-      if (field.field.type.toBaseType(factory) != enumClass.type) {
+      if (field.getReference().type.toBaseType(factory) != enumClass.type) {
         return Reason.TYPE_MISMATCH_FIELD_PUT;
       }
       return Reason.ELIGIBLE;
@@ -1095,7 +1095,7 @@
 
     // Return is used for valueOf methods.
     if (instruction.isReturn()) {
-      DexType returnType = code.method().method.proto.returnType;
+      DexType returnType = code.method().getReference().proto.returnType;
       if (returnType != enumClass.type && returnType.toBaseType(factory) != enumClass.type) {
         return Reason.IMPLICIT_UP_CAST_IN_RETURN;
       }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java
index 88845d9..0d1c0fa 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingCandidateAnalysis.java
@@ -85,18 +85,18 @@
   }
 
   static boolean isEnumField(DexEncodedField staticField, DexType enumType) {
-    return staticField.field.type == enumType
+    return staticField.getReference().type == enumType
         && staticField.accessFlags.isEnum()
         && staticField.accessFlags.isFinal();
   }
 
   static boolean matchesValuesField(
       DexEncodedField staticField, DexType enumType, DexItemFactory factory) {
-    return staticField.field.type.isArrayType()
-        && staticField.field.type.toArrayElementType(factory) == enumType
+    return staticField.getReference().type.isArrayType()
+        && staticField.getReference().type.toArrayElementType(factory) == enumType
         && staticField.accessFlags.isSynthetic()
         && staticField.accessFlags.isFinal()
-        && staticField.field.name == factory.enumValuesFieldName;
+        && staticField.getReference().name == factory.enumValuesFieldName;
   }
 
   private void removeEnumsInAnnotations() {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index 17d0cc7..31e84bb 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -103,7 +103,7 @@
 
   private DexEncodedMethod fixupEncodedMethodToUtility(
       DexEncodedMethod encodedMethod, DexType newHolder) {
-    DexMethod method = encodedMethod.method;
+    DexMethod method = encodedMethod.getReference();
     DexString newMethodName =
         factory.createString(
             enumUnboxerRewriter.compatibleName(method.holder)
@@ -137,9 +137,10 @@
         method.getName().toString() + (method.isNonPrivateVirtualMethod() ? "$enumunboxing$" : "");
     DexMethod newMethod = factory.createMethod(method.getHolderType(), newProto, newMethodName);
     newMethod = ensureUniqueMethod(method, newMethod);
-    int numberOfExtraNullParameters = newMethod.getArity() - method.method.getArity();
+    int numberOfExtraNullParameters = newMethod.getArity() - method.getReference().getArity();
     boolean isStatic = method.isStatic();
-    lensBuilder.move(method.method, newMethod, isStatic, isStatic, numberOfExtraNullParameters);
+    lensBuilder.move(
+        method.getReference(), newMethod, isStatic, isStatic, numberOfExtraNullParameters);
     return method.toTypeSubstitutedMethod(
         newMethod,
         builder ->
@@ -195,7 +196,7 @@
     }
     for (int i = 0; i < fields.size(); i++) {
       DexEncodedField encodedField = fields.get(i);
-      DexField field = encodedField.field;
+      DexField field = encodedField.getReference();
       DexType newType = fixupType(field.type);
       if (newType != field.type) {
         DexField newField = factory.createField(field.holder, newType, field.name);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java
index 7ad0bdb..70b07a6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java
@@ -144,7 +144,7 @@
                 .appInfo()
                 .resolveMethodOnClass(factory.objectMembers.toString, enumFieldType.getClassType())
                 .getSingleTarget();
-        if (singleTarget != null && singleTarget.method != factory.enumMembers.toString) {
+        if (singleTarget != null && singleTarget.getReference() != factory.enumMembers.toString) {
           continue;
         }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/ConcreteCallSiteOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/ConcreteCallSiteOptimizationInfo.java
index ab2b0ac..83fdf6a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/ConcreteCallSiteOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/ConcreteCallSiteOptimizationInfo.java
@@ -81,13 +81,13 @@
 
   private TypeElement[] getStaticTypes(AppView<?> appView, DexEncodedMethod method) {
     int argOffset = method.isStatic() ? 0 : 1;
-    int size = method.method.getArity() + argOffset;
+    int size = method.getReference().getArity() + argOffset;
     TypeElement[] staticTypes = new TypeElement[size];
     if (!method.isStatic()) {
       staticTypes[0] =
           TypeElement.fromDexType(method.getHolderType(), definitelyNotNull(), appView);
     }
-    for (int i = 0; i < method.method.getArity(); i++) {
+    for (int i = 0; i < method.getReference().getArity(); i++) {
       staticTypes[i + argOffset] =
           TypeElement.fromDexType(method.getParameter(i), maybeNull(), appView);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
index aa28923..a48292a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
@@ -215,7 +215,7 @@
       IRCode code,
       OptimizationFeedback feedback,
       InstanceFieldInitializationInfoCollection instanceFieldInitializationInfos) {
-    assert !appView.appInfo().isPinned(method.method);
+    assert !appView.appInfo().isPinned(method.getReference());
 
     if (!method.isInstanceInitializer()) {
       return;
@@ -227,7 +227,7 @@
       return;
     }
 
-    if (appView.appInfo().mayHaveSideEffects.containsKey(method.method)) {
+    if (appView.appInfo().mayHaveSideEffects.containsKey(method.getReference())) {
       return;
     }
 
@@ -813,7 +813,7 @@
       DexEncodedMethod method,
       IRCode code) {
     if (dynamicTypeOptimization != null) {
-      DexType staticReturnTypeRaw = method.method.proto.returnType;
+      DexType staticReturnTypeRaw = method.getReference().proto.returnType;
       if (!staticReturnTypeRaw.isReferenceType()) {
         return;
       }
@@ -887,7 +887,7 @@
     if (!options.enableSideEffectAnalysis) {
       return;
     }
-    if (appView.appInfo().mayHaveSideEffects.containsKey(method.method)) {
+    if (appView.appInfo().mayHaveSideEffects.containsKey(method.getReference())) {
       return;
     }
     ProgramMethod context = code.context();
@@ -954,8 +954,8 @@
             .resolveMethodOnClass(appView.dexItemFactory().objectMembers.finalize, clazz);
     DexEncodedMethod target = resolutionResult.getSingleTarget();
     return target != null
-        && target.method != dexItemFactory.enumMembers.finalize
-        && target.method != dexItemFactory.objectMembers.finalize;
+        && target.getReference() != dexItemFactory.enumMembers.finalize
+        && target.getReference() != dexItemFactory.objectMembers.finalize;
   }
 
   private void computeReturnValueOnlyDependsOnArguments(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
index 411e7a8..5a12983 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
@@ -150,9 +150,13 @@
   @Override
   public void recordFieldHasAbstractValue(
       DexEncodedField field, AppView<AppInfoWithLiveness> appView, AbstractValue abstractValue) {
-    assert appView.appInfo().getFieldAccessInfoCollection().contains(field.field);
-    assert !appView.appInfo().getFieldAccessInfoCollection().get(field.field).hasReflectiveAccess();
-    if (appView.appInfo().mayPropagateValueFor(field.field)) {
+    assert appView.appInfo().getFieldAccessInfoCollection().contains(field.getReference());
+    assert !appView
+        .appInfo()
+        .getFieldAccessInfoCollection()
+        .get(field.getReference())
+        .hasReflectiveAccess();
+    if (appView.appInfo().mayPropagateValueFor(field.getReference())) {
       getFieldOptimizationInfoForUpdating(field).setAbstractValue(abstractValue);
     }
   }
@@ -189,7 +193,7 @@
   @Override
   public synchronized void methodReturnsAbstractValue(
       DexEncodedMethod method, AppView<AppInfoWithLiveness> appView, AbstractValue value) {
-    if (appView.appInfo().mayPropagateValueFor(method.method)) {
+    if (appView.appInfo().mayPropagateValueFor(method.getReference())) {
       getMethodOptimizationInfoForUpdating(method).markReturnsAbstractValue(value);
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
index 3fb77d9..5c39d40 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
@@ -66,7 +66,7 @@
   @Override
   public void recordFieldHasAbstractValue(
       DexEncodedField field, AppView<AppInfoWithLiveness> appView, AbstractValue abstractValue) {
-    if (appView.appInfo().mayPropagateValueFor(field.field)) {
+    if (appView.appInfo().mayPropagateValueFor(field.getReference())) {
       field.getMutableOptimizationInfo().setAbstractValue(abstractValue);
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfoCollection.java
index 9fa412a..aca1f76 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfoCollection.java
@@ -47,7 +47,7 @@
 
     public void recordInitializationInfo(
         DexEncodedField field, InstanceFieldInitializationInfo info) {
-      recordInitializationInfo(field.field, info);
+      recordInitializationInfo(field.getReference(), info);
     }
 
     public Builder recordInitializationInfo(DexField field, InstanceFieldInitializationInfo info) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java
index 6335e27..2081721 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java
@@ -57,7 +57,8 @@
 
   @Override
   public InstanceFieldInitializationInfo get(DexEncodedField field) {
-    return infos.getOrDefault(field.field, UnknownInstanceFieldInitializationInfo.getInstance());
+    return infos.getOrDefault(
+        field.getReference(), UnknownInstanceFieldInitializationInfo.getInstance());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java
index 2de1eb0..b986800 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java
@@ -94,7 +94,8 @@
     for (DexEncodedField field : finalLibraryFields) {
       if (field.isStatic()) {
         feedback.recordLibraryFieldHasAbstractValue(
-            field, abstractValueFactory.createSingleFieldValue(field.field, ObjectState.empty()));
+            field,
+            abstractValueFactory.createSingleFieldValue(field.getReference(), ObjectState.empty()));
       }
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
index 5a2f63a..7761bfa 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
@@ -128,7 +128,7 @@
               // field. The requirements for the initialization of this field will be
               // checked later.
               for (DexEncodedField field : cls.staticFields()) {
-                DexType type = field.field.type;
+                DexType type = field.getReference().type;
                 if (singletonFields.put(type, field) != null) {
                   // There is already candidate singleton field found.
                   markNotEligible(type, notEligible);
@@ -137,7 +137,7 @@
 
               // Don't allow fields with this candidate types.
               for (DexEncodedField field : cls.instanceFields()) {
-                markNotEligible(field.field.type, notEligible);
+                markNotEligible(field.getReference().type, notEligible);
               }
 
               // Don't allow methods that take a value of this type.
@@ -192,11 +192,11 @@
 
   private boolean isPinned(DexClass clazz, DexEncodedField singletonField) {
     AppInfoWithLiveness appInfo = appView.appInfo();
-    if (appInfo.isPinned(clazz.type) || appInfo.isPinned(singletonField.field)) {
+    if (appInfo.isPinned(clazz.type) || appInfo.isPinned(singletonField.getReference())) {
       return true;
     }
     for (DexEncodedMethod method : clazz.methods()) {
-      if (!method.isStatic() && appInfo.isPinned(method.method)) {
+      if (!method.isStatic() && appInfo.isPinned(method.getReference())) {
         return true;
       }
     }
@@ -589,7 +589,7 @@
 
     if (invoke.hasOutValue()
         && candidateInfo.getter.get() != null
-        && candidateInfo.getter.get().method == invoke.getInvokedMethod()) {
+        && candidateInfo.getter.get().getReference() == invoke.getInvokedMethod()) {
       candidateInfo = analyzeAllValueUsers(candidateInfo, invoke.outValue(), false);
     }
     return candidateInfo;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
index 27806d5..69d65c8 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
@@ -253,13 +253,15 @@
                 .filter(
                     instruction -> {
                       if (instruction.isStaticGet()
-                          && instruction.asStaticGet().getField() == info.singletonField.field) {
+                          && instruction.asStaticGet().getField()
+                              == info.singletonField.getReference()) {
                         return true;
                       }
                       DexEncodedMethod getter = info.getter.get();
                       return getter != null
                           && instruction.isInvokeStatic()
-                          && instruction.asInvokeStatic().getInvokedMethod() == getter.method;
+                          && instruction.asInvokeStatic().getInvokedMethod()
+                              == getter.getReference();
                     })
                 .collect(Collectors.toList());
         boolean fixableFieldReadsPerUsage = true;
@@ -319,10 +321,10 @@
             return false;
           },
           methodsToBeStaticized::add);
-      singletonFields.put(candidate.singletonField.field, candidate);
+      singletonFields.put(candidate.singletonField.getReference(), candidate);
       DexEncodedMethod getter = candidate.getter.get();
       if (getter != null) {
-        singletonGetters.put(getter.method, candidate);
+        singletonGetters.put(getter.getReference(), candidate);
       }
       ProgramMethodSet referencedFrom =
           materializedReferencedFromCollections.getOrDefault(candidate, ProgramMethodSet.empty());
@@ -447,7 +449,8 @@
         if (newInstance.outValue().hasAnyUsers()) {
           TypeElement type = TypeElement.fromDexType(newInstance.clazz, maybeNull(), appView);
           newInstance.replace(
-              new StaticGet(code.createValue(type), candidateInfo.singletonField.field), code);
+              new StaticGet(code.createValue(type), candidateInfo.singletonField.getReference()),
+              code);
         } else {
           newInstance.removeOrReplaceByDebugLocalRead(code);
         }
@@ -753,11 +756,11 @@
       for (DexEncodedMethod method : candidateClass.methods()) {
         if (method.isStatic()) {
           newDirectMethods.add(method);
-        } else if (!factory().isConstructor(method.method)) {
+        } else if (!factory().isConstructor(method.getReference())) {
           DexEncodedMethod staticizedMethod = method.toStaticMethodWithoutThis();
           newDirectMethods.add(staticizedMethod);
           staticizedMethods.createAndAdd(candidateClass, staticizedMethod);
-          methodMapping.put(method.method, staticizedMethod.method);
+          methodMapping.put(method.getReference(), staticizedMethod.getReference());
         }
       }
       candidateClass.setVirtualMethods(DexEncodedMethod.EMPTY_ARRAY);
@@ -786,8 +789,9 @@
   private boolean classMembersConflict(DexClass a, DexClass b) {
     assert Streams.stream(a.methods()).allMatch(DexEncodedMethod::isStatic);
     assert a.instanceFields().size() == 0;
-    return a.staticFields().stream().anyMatch(fld -> b.lookupField(fld.field) != null)
-        || Streams.stream(a.methods()).anyMatch(method -> b.lookupMethod(method.method) != null);
+    return a.staticFields().stream().anyMatch(fld -> b.lookupField(fld.getReference()) != null)
+        || Streams.stream(a.methods())
+            .anyMatch(method -> b.lookupMethod(method.getReference()) != null);
   }
 
   private boolean hasMembersNotStaticized(
@@ -818,10 +822,10 @@
     List<DexEncodedField> oldFields = hostClass.staticFields();
     for (int i = 0; i < oldFields.size(); i++) {
       DexEncodedField field = oldFields.get(i);
-      DexField newField = mapCandidateField(field.field, candidateClass.type, hostType);
-      if (newField != field.field) {
+      DexField newField = mapCandidateField(field.getReference(), candidateClass.type, hostType);
+      if (newField != field.getReference()) {
         newFields[i] = field.toTypeSubstitutedField(newField);
-        fieldMapping.put(field.field, newField);
+        fieldMapping.put(field.getReference(), newField);
       } else {
         newFields[i] = field;
       }
@@ -830,10 +834,10 @@
       List<DexEncodedField> extraFields = candidateClass.staticFields();
       for (int i = 0; i < extraFields.size(); i++) {
         DexEncodedField field = extraFields.get(i);
-        DexField newField = mapCandidateField(field.field, candidateClass.type, hostType);
-        if (newField != field.field) {
+        DexField newField = mapCandidateField(field.getReference(), candidateClass.type, hostType);
+        if (newField != field.getReference()) {
           newFields[numOfHostStaticFields + i] = field.toTypeSubstitutedField(newField);
-          fieldMapping.put(field.field, newField);
+          fieldMapping.put(field.getReference(), newField);
         } else {
           newFields[numOfHostStaticFields + i] = field;
         }
@@ -852,7 +856,8 @@
     for (DexEncodedMethod method : extraMethods) {
       DexEncodedMethod newMethod =
           method.toTypeSubstitutedMethod(
-              factory().createMethod(hostType, method.method.proto, method.method.name));
+              factory()
+                  .createMethod(hostType, method.getReference().proto, method.getReference().name));
       newMethods.add(newMethod);
       // If the old method from the candidate class has been staticized,
       if (staticizedMethods.remove(method)) {
@@ -860,11 +865,11 @@
         // has just been migrated to the host class.
         staticizedMethods.createAndAdd(hostClass, newMethod);
       }
-      DexMethod originalMethod = methodMapping.getRepresentativeKey(method.method);
+      DexMethod originalMethod = methodMapping.getRepresentativeKey(method.getReference());
       if (originalMethod == null) {
-        methodMapping.put(method.method, newMethod.method);
+        methodMapping.put(method.getReference(), newMethod.getReference());
       } else {
-        methodMapping.put(originalMethod, newMethod.method);
+        methodMapping.put(originalMethod, newMethod.getReference());
       }
     }
     hostClass.addDirectMethods(newMethods);
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
index 012bd0e..179dffd 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
@@ -609,7 +609,7 @@
     if (intervals == null) {
       throw new CompilationError(
           "Unexpected attempt to get register for a value without a register in method `"
-              + code.method().method.toSourceString()
+              + code.method().getReference().toSourceString()
               + "`.",
           code.origin);
     }
diff --git a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
index 1587e8a..5ade4de 100644
--- a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
@@ -218,9 +218,9 @@
     if (clazz.isRecord()) {
       // TODO(b/169645628): Strip record components if not kept.
       for (DexEncodedField instanceField : clazz.instanceFields()) {
-        String componentName = namingLens.lookupName(instanceField.field).toString();
+        String componentName = namingLens.lookupName(instanceField.getReference()).toString();
         String componentDescriptor =
-            namingLens.lookupDescriptor(instanceField.field.type).toString();
+            namingLens.lookupDescriptor(instanceField.getReference().type).toString();
         String componentSignature =
             instanceField.getGenericSignature().toRenamedString(namingLens, isTypeMissing);
         writer.visitRecordComponent(componentName, componentDescriptor, componentSignature);
@@ -239,7 +239,9 @@
     }
     if (options.desugarSpecificOptions().sortMethodsOnCfOutput) {
       SortedSet<ProgramMethod> programMethodSortedSet =
-          Sets.newTreeSet((a, b) -> a.getDefinition().method.compareTo(b.getDefinition().method));
+          Sets.newTreeSet(
+              (a, b) ->
+                  a.getDefinition().getReference().compareTo(b.getDefinition().getReference()));
       clazz.forEachProgramMethod(programMethodSortedSet::add);
       programMethodSortedSet.forEach(
           method -> writeMethod(method, version, rewriter, writer, defaults));
@@ -268,7 +270,7 @@
       // In this case bridges have been introduced for the Cf back-end,
       // which do not have class file version.
       assert options.isDesugaredLibraryCompilation() || options.cfToCfDesugar
-          : "Expected class file version for " + method.method.toSourceString();
+          : "Expected class file version for " + method.getReference().toSourceString();
       assert MIN_VERSION_FOR_COMPILER_GENERATED_CODE.isLessThan(
           options.classFileVersionAfterDesugaring(InternalOptions.SUPPORTED_CF_VERSION));
       // Any desugaring rewrites which cannot meet the default class file version after
@@ -355,8 +357,8 @@
     if (field.isDeprecated()) {
       access = AsmUtils.withDeprecated(access);
     }
-    String name = namingLens.lookupName(field.field).toString();
-    String desc = namingLens.lookupDescriptor(field.field.type).toString();
+    String name = namingLens.lookupName(field.getReference()).toString();
+    String desc = namingLens.lookupDescriptor(field.getReference().type).toString();
     String signature = field.getGenericSignature().toRenamedString(namingLens, isTypeMissing);
     Object value = getStaticValue(field);
     FieldVisitor visitor = writer.visitField(access, name, desc, signature, value);
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
index d9baf1f..f10902f 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -93,11 +93,11 @@
       Consumer<DexEncodedMethod> keepByteCode) {
     Map<String, DexEncodedField> fieldMap = new HashMap<>();
     for (DexEncodedField field : hostClass.fields()) {
-      fieldMap.put(toJvmFieldSignature(field.field).asString(), field);
+      fieldMap.put(toJvmFieldSignature(field.getReference()).asString(), field);
     }
     Map<String, DexEncodedMethod> methodMap = new HashMap<>();
     for (DexEncodedMethod method : hostClass.methods()) {
-      methodMap.put(toJvmMethodSignature(method.method).asString(), method);
+      methodMap.put(toJvmMethodSignature(method.getReference()).asString(), method);
     }
     ImmutableList.Builder<KotlinConstructorInfo> notBackedConstructors = ImmutableList.builder();
     for (KmConstructor kmConstructor : kmClass.getConstructors()) {
@@ -184,7 +184,7 @@
       return;
     }
     for (DexEncodedField field : hostClass.fields()) {
-      if (field.field.name.toString().equals(companionObjectName)) {
+      if (field.getReference().name.toString().equals(companionObjectName)) {
         field.setKotlinMemberInfo(new KotlinCompanionInfo());
         return;
       }
@@ -221,7 +221,10 @@
     // Find a companion object.
     for (DexEncodedField field : clazz.fields()) {
       if (field.getKotlinMemberInfo().isCompanion()) {
-        field.getKotlinMemberInfo().asCompanion().rewrite(kmClass, field.field, namingLens);
+        field
+            .getKotlinMemberInfo()
+            .asCompanion()
+            .rewrite(kmClass, field.getReference(), namingLens);
       }
     }
     // Take all not backed constructors because we will never find them in definitions.
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
index 79b4173..7447bbd 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
@@ -184,7 +184,7 @@
       }
       KotlinPropertyGroup kotlinPropertyGroup =
           properties.computeIfAbsent(kotlinPropertyInfo, ignored -> new KotlinPropertyGroup());
-      if (method.method.proto.returnType == appView.dexItemFactory().voidType) {
+      if (method.getReference().proto.returnType == appView.dexItemFactory().voidType) {
         // This is a setter.
         kotlinPropertyGroup.setSetter(method);
       } else {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
index f5ce062..008177e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
@@ -114,8 +114,8 @@
     // TODO(b/154348683): Check method for flags to pass in.
     String finalName = this.name;
     if (method != null) {
-      String methodName = method.method.name.toString();
-      String rewrittenName = namingLens.lookupName(method.method).toString();
+      String methodName = method.getReference().name.toString();
+      String rewrittenName = namingLens.lookupName(method.getReference()).toString();
       if (!methodName.equals(rewrittenName)) {
         finalName = rewrittenName;
       }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java
index 974e4a8..2606807 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java
@@ -40,8 +40,8 @@
       DexEncodedField field, AppView<?> appView, NamingLens namingLens) {
     String finalName = name;
     if (field != null) {
-      String fieldName = field.field.name.toString();
-      String rewrittenName = namingLens.lookupName(field.field).toString();
+      String fieldName = field.getReference().name.toString();
+      String rewrittenName = namingLens.lookupName(field.getReference()).toString();
       if (!fieldName.equals(rewrittenName)) {
         finalName = rewrittenName;
       }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java
index 2469a54..b0314be 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java
@@ -79,8 +79,8 @@
     assert returnType != null;
     String finalName = name;
     if (method != null) {
-      String methodName = method.method.name.toString();
-      String rewrittenName = namingLens.lookupName(method.method).toString();
+      String methodName = method.getReference().name.toString();
+      String rewrittenName = namingLens.lookupName(method.getReference()).toString();
       if (!methodName.equals(rewrittenName)) {
         finalName = rewrittenName;
       }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
index cc215d5..01a7c2a 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
@@ -40,7 +40,7 @@
     JvmMethodSignature signature = JvmExtensionsKt.getSignature(lambda.function);
     if (signature != null) {
       for (DexEncodedMethod method : clazz.methods()) {
-        if (toJvmMethodSignature(method.method).asString().equals(signature.asString())) {
+        if (toJvmMethodSignature(method.getReference()).asString().equals(signature.asString())) {
           method.setKotlinMemberInfo(kotlinFunctionInfo);
           return new KotlinLambdaInfo(kotlinFunctionInfo, true);
         }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
index 1e3273c..4a5904e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -182,7 +182,10 @@
     if (kotlinMetadata == null || kotlinMetadata.isNotProgramClass()) {
       return true;
     }
-    return kotlinMetadata.methods(method -> method.method.name == fieldName).iterator().hasNext();
+    return kotlinMetadata
+        .methods(method -> method.getReference().name == fieldName)
+        .iterator()
+        .hasNext();
   }
 
   private DexAnnotation createKotlinMetadataAnnotation(
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
index 1ac03db..41ff17d 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
@@ -47,11 +47,11 @@
       Consumer<DexEncodedMethod> keepByteCode) {
     Map<String, DexEncodedField> fieldMap = new HashMap<>();
     for (DexEncodedField field : clazz.fields()) {
-      fieldMap.put(toJvmFieldSignature(field.field).asString(), field);
+      fieldMap.put(toJvmFieldSignature(field.getReference()).asString(), field);
     }
     Map<String, DexEncodedMethod> methodMap = new HashMap<>();
     for (DexEncodedMethod method : clazz.methods()) {
-      methodMap.put(toJvmMethodSignature(method.method).asString(), method);
+      methodMap.put(toJvmMethodSignature(method.getReference()).asString(), method);
     }
     return new KotlinPackageInfo(
         JvmExtensionsKt.getModuleName(kmPackage),
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
index 1b91b62..9ab6c15 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
@@ -152,11 +152,11 @@
   }
 
   private void renameDanglingTypesInField(DexEncodedField field) {
-    renameDanglingType(field.field.type);
+    renameDanglingType(field.getReference().type);
   }
 
   private void renameDanglingTypesInMethod(DexEncodedMethod method) {
-    DexProto proto = method.method.proto;
+    DexProto proto = method.getReference().proto;
     renameDanglingType(proto.returnType);
     for (DexType type : proto.parameters.values) {
       renameDanglingType(type);
diff --git a/src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java b/src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
index 55ed725..bec8073 100644
--- a/src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
@@ -106,10 +106,10 @@
                     reservedNames = getOrCreateReservedFieldNamingState(clazz.type);
                   }
                   reservedNames.markReservedDirectly(
-                      reservedName, field.field.name, field.field.type);
+                      reservedName, field.getReference().name, field.getReference().type);
                   // TODO(b/148846065): Consider lazily computing the renaming on actual lookups.
-                  if (reservedName != field.field.name) {
-                    renaming.put(field.field, reservedName);
+                  if (reservedName != field.getReference().name) {
+                    renaming.put(field.getReference(), reservedName);
                   }
                 }
               }
@@ -135,8 +135,8 @@
             clazz -> {
               for (DexEncodedField field : clazz.fields()) {
                 DexString reservedName = strategy.getReservedName(field, clazz);
-                if (reservedName != null && reservedName != field.field.name) {
-                  renaming.put(field.field, reservedName);
+                if (reservedName != null && reservedName != field.getReference().name) {
+                  renaming.put(field.getReference(), reservedName);
                 }
               }
             });
@@ -270,8 +270,10 @@
       return;
     }
     DexEncodedField definition = appView.appInfo().resolveFieldOn(holder, field).getResolvedField();
-    if (definition != null && definition.field != field && renaming.containsKey(definition.field)) {
-      renaming.put(field, renaming.get(definition.field));
+    if (definition != null
+        && definition.getReference() != field
+        && renaming.containsKey(definition.getReference())) {
+      renaming.put(field, renaming.get(definition.getReference()));
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
index 2d9a19d..e0de1d5 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
@@ -74,7 +74,7 @@
 
   private void decoupleIdentifierNameStringInStaticField(DexEncodedField encodedField) {
     assert encodedField.accessFlags.isStatic();
-    if (!identifierNameStrings.containsKey(encodedField.field)) {
+    if (!identifierNameStrings.containsKey(encodedField.getReference())) {
       return;
     }
     DexValueString staticValue = encodedField.getStaticValue().asDexValueString();
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
index 01157b9..3e4078b 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
@@ -378,9 +378,9 @@
 
   private static DexField inferFieldInHolder(DexClass holder, String name, DexType fieldType) {
     for (DexEncodedField encodedField : holder.fields()) {
-      if (encodedField.field.name.toString().equals(name)
-          && (fieldType == null || encodedField.field.type == fieldType)) {
-        return encodedField.field;
+      if (encodedField.getReference().name.toString().equals(name)
+          && (fieldType == null || encodedField.getReference().type == fieldType)) {
+        return encodedField.getReference();
       }
     }
     return null;
@@ -388,8 +388,8 @@
 
   private static DexMethod inferMethodNameInHolder(DexClass holder, String name) {
     for (DexEncodedMethod encodedMethod : holder.methods()) {
-      if (encodedMethod.method.name.toString().equals(name)) {
-        return encodedMethod.method;
+      if (encodedMethod.getReference().name.toString().equals(name)) {
+        return encodedMethod.getReference();
       }
     }
     return null;
@@ -399,9 +399,9 @@
       DexClass holder, String name, DexTypeList arguments) {
     assert arguments != null;
     for (DexEncodedMethod encodedMethod : holder.methods()) {
-      if (encodedMethod.method.name.toString().equals(name)
-          && encodedMethod.method.proto.parameters.equals(arguments)) {
-        return encodedMethod.method;
+      if (encodedMethod.getReference().name.toString().equals(name)
+          && encodedMethod.getReference().proto.parameters.equals(arguments)) {
+        return encodedMethod.getReference();
       }
     }
     return null;
diff --git a/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java b/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
index 0f5924d..3ba2467 100644
--- a/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
@@ -483,7 +483,8 @@
                   boolean differentName = implementedMethod.getName() != virtualMethod.getName();
                   if (differentName
                       && MethodJavaSignatureEquivalence.getEquivalenceIgnoreName()
-                          .equivalent(implementedMethod.method, virtualMethod.method)) {
+                          .equivalent(
+                              implementedMethod.getReference(), virtualMethod.getReference())) {
                     InterfaceMethodGroupState interfaceMethodGroupState =
                         globalStateMap.computeIfAbsent(
                             definitionEquivalence.wrap(implementedMethod),
diff --git a/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java b/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
index eb4e9ca..a51edde 100644
--- a/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
+++ b/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
@@ -96,7 +96,7 @@
     // If the method does not have a direct renaming, return the resolutions mapping.
     ResolutionResult resolutionResult = appView.appInfo().unsafeResolveMethodDueToDexFormat(method);
     if (resolutionResult.isSingleResolution()) {
-      return renaming.getOrDefault(resolutionResult.getSingleTarget().method, method.name);
+      return renaming.getOrDefault(resolutionResult.getSingleTarget().getReference(), method.name);
     }
     // If resolution fails, the method must be renamed consistently with the targets that give rise
     // to the failure.
@@ -104,8 +104,9 @@
       List<DexEncodedMethod> targets = new ArrayList<>();
       resolutionResult.asFailedResolution().forEachFailureDependency(targets::add);
       if (!targets.isEmpty()) {
-        DexString firstRename = renaming.get(targets.get(0).method);
-        assert targets.stream().allMatch(target -> renaming.get(target.method) == firstRename);
+        DexString firstRename = renaming.get(targets.get(0).getReference());
+        assert targets.stream()
+            .allMatch(target -> renaming.get(target.getReference()) == firstRename);
         if (firstRename != null) {
           return firstRename;
         }
@@ -138,7 +139,7 @@
       // If we can resolve `item`, then the renaming for `item` and its resolution should be the
       // same.
       DexEncodedMethod resolvedMethod = resolution.asSingleResolution().getResolvedMethod();
-      assert lookupName(method) == lookupName(resolvedMethod.method);
+      assert lookupName(method) == lookupName(resolvedMethod.getReference());
       return true;
     }
 
@@ -162,7 +163,7 @@
         .asFailedResolution()
         .forEachFailureDependency(
             failureDependence -> {
-              assert lookupName(method) == lookupName(failureDependence.method);
+              assert lookupName(method) == lookupName(failureDependence.getReference());
             });
     return true;
   }
diff --git a/src/main/java/com/android/tools/r8/naming/Minifier.java b/src/main/java/com/android/tools/r8/naming/Minifier.java
index c00993f..a542a2f 100644
--- a/src/main/java/com/android/tools/r8/naming/Minifier.java
+++ b/src/main/java/com/android/tools/r8/naming/Minifier.java
@@ -260,22 +260,24 @@
       if (!allowMemberRenaming(holder)
           || holder.accessFlags.isAnnotation()
           || method.accessFlags.isConstructor()
-          || !appView.appInfo().isMinificationAllowed(method.method)) {
-        return method.method.name;
+          || !appView.appInfo().isMinificationAllowed(method.getReference())) {
+        return method.getReference().name;
       }
       if (desugaredLibraryRenaming
           && method.isLibraryMethodOverride().isTrue()
-          && appView.rewritePrefix.hasRewrittenTypeInSignature(method.method.proto, appView)) {
+          && appView.rewritePrefix.hasRewrittenTypeInSignature(
+              method.getReference().proto, appView)) {
         // With desugared library, call-backs names are reserved here.
-        return method.method.name;
+        return method.getReference().name;
       }
       return null;
     }
 
     @Override
     public DexString getReservedName(DexEncodedField field, DexClass holder) {
-      if (holder.isLibraryClass() || !appView.appInfo().isMinificationAllowed(field.field)) {
-        return field.field.name;
+      if (holder.isLibraryClass()
+          || !appView.appInfo().isMinificationAllowed(field.getReference())) {
+        return field.getReference().name;
       }
       return null;
     }
diff --git a/src/main/java/com/android/tools/r8/naming/NamingLens.java b/src/main/java/com/android/tools/r8/naming/NamingLens.java
index bdd0e70..b6e94ee 100644
--- a/src/main/java/com/android/tools/r8/naming/NamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/NamingLens.java
@@ -166,14 +166,14 @@
       }
 
       for (DexEncodedField field : clazz.fields()) {
-        DexField newField = lookupField(field.field, dexItemFactory);
+        DexField newField = lookupField(field.getReference(), dexItemFactory);
         boolean referencesChanged = references.add(newField);
         assert referencesChanged
             : "Duplicate definition of field `" + newField.toSourceString() + "`";
       }
 
       for (DexEncodedMethod method : clazz.methods()) {
-        DexMethod newMethod = lookupMethod(method.method, dexItemFactory);
+        DexMethod newMethod = lookupMethod(method.getReference(), dexItemFactory);
         boolean referencesChanged = references.add(newMethod);
         assert referencesChanged
             : "Duplicate definition of method `" + newMethod.toSourceString() + "`";
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
index d902890..a8e299a 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
@@ -502,12 +502,12 @@
 
     @Override
     public DexString getReservedName(DexEncodedMethod method, DexClass holder) {
-      return getReservedName(method, method.method.name, holder);
+      return getReservedName(method, method.getReference().name, holder);
     }
 
     @Override
     public DexString getReservedName(DexEncodedField field, DexClass holder) {
-      return getReservedName(field, field.field.name, holder);
+      return getReservedName(field, field.getReference().name, holder);
     }
 
     private DexString getReservedName(DexDefinition definition, DexString name, DexClass holder) {
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index 04a24b6..2b9252f 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -188,11 +188,11 @@
           DexEncodedMethod target = lookupTarget.apply(method);
           // TODO(b/128404854) Rebind to the lowest library class or program class. For now we allow
           //  searching in library for methods, but this should be done on classpath instead.
-          if (target == null || target.method == method) {
+          if (target == null || target.getReference() == method) {
             return;
           }
           DexClass targetClass = appView.definitionFor(target.getHolderType());
-          DexMethod targetMethod = target.method;
+          DexMethod targetMethod = target.getReference();
           if (originalClass.isProgramClass()) {
             // In Java bytecode, it is only possible to target interface methods that are in one of
             // the immediate super-interfaces via a super-invocation (see
@@ -235,7 +235,7 @@
                   target.toForwardingMethod(bridgeHolder, appView);
               bridgeHolder.addMethod(bridgeMethodDefinition);
             }
-            assert lookupTarget.apply(method).method == bridgeMethod;
+            assert lookupTarget.apply(method).getReference() == bridgeMethod;
           }
         });
   }
@@ -267,7 +267,7 @@
     assert bridgeHolder != null;
     assert bridgeHolder != targetClass;
     bridges.accept(bridgeHolder, method, target);
-    return target.method.withHolder(bridgeHolder.getType(), appView.dexItemFactory());
+    return target.getReference().withHolder(bridgeHolder.getType(), appView.dexItemFactory());
   }
 
   private DexProgramClass findHolderForInterfaceMethodBridge(DexProgramClass clazz, DexType iface) {
@@ -316,9 +316,9 @@
           findHolderForVisibilityBridge(originalClass, targetClass, packageDescriptor);
       assert bridgeHolder != null;
       bridges.accept(bridgeHolder, method, target);
-      return target.method.withHolder(bridgeHolder.getType(), appView.dexItemFactory());
+      return target.getReference().withHolder(bridgeHolder.getType(), appView.dexItemFactory());
     }
-    return target.method;
+    return target.getReference();
   }
 
   private DexProgramClass findHolderForVisibilityBridge(
diff --git a/src/main/java/com/android/tools/r8/optimize/VisibilityBridgeRemover.java b/src/main/java/com/android/tools/r8/optimize/VisibilityBridgeRemover.java
index 96dd07b..f073314 100644
--- a/src/main/java/com/android/tools/r8/optimize/VisibilityBridgeRemover.java
+++ b/src/main/java/com/android/tools/r8/optimize/VisibilityBridgeRemover.java
@@ -87,7 +87,10 @@
         if (targetMethod != null && targetMethod.accessFlags.isPublic()) {
           if (Log.ENABLED) {
             Log.info(
-                getClass(), "Removing visibility forwarding %s -> %s", method, targetMethod.method);
+                getClass(),
+                "Removing visibility forwarding %s -> %s",
+                method,
+                targetMethod.getReference());
           }
           return true;
         }
diff --git a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java
index ea4ee0e..69c59b5 100644
--- a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java
+++ b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java
@@ -140,7 +140,7 @@
       for (DexEncodedMethod method : subclass.virtualMethods()) {
         BridgeInfo bridgeInfo = method.getOptimizationInfo().getBridgeInfo();
         if (bridgeInfo != null) {
-          candidates.add(equivalence.wrap(method.method));
+          candidates.add(equivalence.wrap(method.getReference()));
         }
       }
     }
diff --git a/src/main/java/com/android/tools/r8/shaking/AbstractMethodRemover.java b/src/main/java/com/android/tools/r8/shaking/AbstractMethodRemover.java
index b64646d..4123c10 100644
--- a/src/main/java/com/android/tools/r8/shaking/AbstractMethodRemover.java
+++ b/src/main/java/com/android/tools/r8/shaking/AbstractMethodRemover.java
@@ -64,7 +64,7 @@
       DexEncodedMethod method = virtualMethods.get(i);
       if (scope.addMethodIfMoreVisible(method) != AddMethodIfMoreVisibleResult.NOT_ADDED
           || !method.accessFlags.isAbstract()
-          || appView.appInfo().isPinned(method.method)) {
+          || appView.appInfo().isPinned(method.getReference())) {
         if (methods != null) {
           methods.add(method);
         }
@@ -76,7 +76,7 @@
           }
         }
         if (Log.ENABLED) {
-          Log.debug(getClass(), "Removing abstract method %s.", method.method);
+          Log.debug(getClass(), "Removing abstract method %s.", method.getReference());
         }
       }
     }
diff --git a/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java b/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java
index 057a80f..34c11ee 100644
--- a/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java
+++ b/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java
@@ -254,7 +254,7 @@
     boolean liveGetter =
         definition
             .getMethodCollection()
-            .hasVirtualMethods(method -> method.method.name == original.name);
+            .hasVirtualMethods(method -> method.getReference().name == original.name);
     return liveGetter ? original : null;
   }
 
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index c9db30c..4622786 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -731,7 +731,7 @@
       }
       assert clazz.isInterface();
       for (DexEncodedMethod method : clazz.virtualMethods()) {
-        if (method.method.name == callSite.methodName && method.accessFlags.isAbstract()) {
+        if (method.getReference().name == callSite.methodName && method.accessFlags.isAbstract()) {
           result.add(method);
         }
       }
@@ -810,7 +810,7 @@
 
   public boolean isFieldRead(DexEncodedField encodedField) {
     assert checkIfObsolete();
-    DexField field = encodedField.field;
+    DexField field = encodedField.getReference();
     FieldAccessInfo info = getFieldAccessInfoCollection().get(field);
     if (info != null && info.isRead()) {
       return true;
@@ -824,12 +824,13 @@
 
   public boolean isFieldWritten(DexEncodedField encodedField) {
     assert checkIfObsolete();
-    return isFieldWrittenByFieldPutInstruction(encodedField) || isPinned(encodedField.field);
+    return isFieldWrittenByFieldPutInstruction(encodedField)
+        || isPinned(encodedField.getReference());
   }
 
   public boolean isFieldWrittenByFieldPutInstruction(DexEncodedField encodedField) {
     assert checkIfObsolete();
-    DexField field = encodedField.field;
+    DexField field = encodedField.getReference();
     FieldAccessInfo info = getFieldAccessInfoCollection().get(field);
     if (info != null && info.isWritten()) {
       // The field is written directly by the program itself.
@@ -842,7 +843,7 @@
   public boolean isFieldOnlyWrittenInMethod(DexEncodedField field, DexEncodedMethod method) {
     assert checkIfObsolete();
     assert isFieldWritten(field) : "Expected field `" + field.toSourceString() + "` to be written";
-    if (isPinned(field.field)) {
+    if (isPinned(field.getReference())) {
       return false;
     }
     return isFieldOnlyWrittenInMethodIgnoringPinning(field, method);
@@ -852,7 +853,7 @@
       DexEncodedField field, DexEncodedMethod method) {
     assert checkIfObsolete();
     assert isFieldWritten(field) : "Expected field `" + field.toSourceString() + "` to be written";
-    FieldAccessInfo fieldAccessInfo = getFieldAccessInfoCollection().get(field.field);
+    FieldAccessInfo fieldAccessInfo = getFieldAccessInfoCollection().get(field.getReference());
     return fieldAccessInfo != null
         && fieldAccessInfo.isWritten()
         && !fieldAccessInfo.isWrittenOutside(method);
@@ -861,10 +862,10 @@
   public boolean isInstanceFieldWrittenOnlyInInstanceInitializers(DexEncodedField field) {
     assert checkIfObsolete();
     assert isFieldWritten(field) : "Expected field `" + field.toSourceString() + "` to be written";
-    if (isPinned(field.field)) {
+    if (isPinned(field.getReference())) {
       return false;
     }
-    FieldAccessInfo fieldAccessInfo = getFieldAccessInfoCollection().get(field.field);
+    FieldAccessInfo fieldAccessInfo = getFieldAccessInfoCollection().get(field.getReference());
     if (fieldAccessInfo == null || !fieldAccessInfo.isWritten()) {
       return false;
     }
@@ -999,7 +1000,7 @@
     DexProgramClass clazz = asProgramClassOrNull(definitionFor(type));
     if (clazz != null) {
       for (DexEncodedMethod method : clazz.directMethods()) {
-        if (method.isInstanceInitializer() && isPinned(method.method)) {
+        if (method.isInstanceInitializer() && isPinned(method.getReference())) {
           return true;
         }
       }
@@ -1271,7 +1272,7 @@
       if (refinedReceiverClass.isProgramClass()) {
         DexClassAndMethod clazzAndMethod =
             resolution.lookupVirtualDispatchTarget(refinedReceiverClass.asProgramClass(), this);
-        if (clazzAndMethod == null || isPinned(clazzAndMethod.getDefinition().method)) {
+        if (clazzAndMethod == null || isPinned(clazzAndMethod.getDefinition().getReference())) {
           // TODO(b/150640456): We should maybe only consider program methods.
           return DexEncodedMethod.SENTINEL;
         }
@@ -1283,7 +1284,7 @@
         // implementation, but we use this for library modelling.
         DexEncodedMethod resolvedMethod = resolution.getResolvedMethod();
         DexEncodedMethod targetOnReceiver =
-            refinedReceiverClass.lookupVirtualMethod(resolvedMethod.method);
+            refinedReceiverClass.lookupVirtualMethod(resolvedMethod.getReference());
         if (targetOnReceiver != null && isOverriding(resolvedMethod, targetOnReceiver)) {
           return targetOnReceiver;
         }
diff --git a/src/main/java/com/android/tools/r8/shaking/ClassInitFieldSynthesizer.java b/src/main/java/com/android/tools/r8/shaking/ClassInitFieldSynthesizer.java
index f032832..03611d6 100644
--- a/src/main/java/com/android/tools/r8/shaking/ClassInitFieldSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/shaking/ClassInitFieldSynthesizer.java
@@ -54,7 +54,7 @@
       }
       // When compiling for dex, we can't use wide fields since we've only allocated a single
       // register for the out-value of each ClassInit instruction
-      if (staticField.field.type.isWideType()) {
+      if (staticField.getReference().type.isWideType()) {
         continue;
       }
       if (encodedClinitField == null) {
@@ -90,7 +90,7 @@
               d8R8Synthesized);
       clazz.appendStaticField(encodedClinitField);
     }
-    lensBuilder.map(type, encodedClinitField.field);
+    lensBuilder.map(type, encodedClinitField.getReference());
   }
 
   private boolean isMinimumRequiredVisibility(
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index e818526..331466b 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -929,17 +929,17 @@
       }
 
       // Check if we have previously created a FieldAccessInfo object for the field definition.
-      info = fieldAccessInfoCollection.get(encodedField.field);
+      info = fieldAccessInfoCollection.get(encodedField.getReference());
 
       // If not, we must create one.
       if (info == null) {
-        info = new FieldAccessInfoImpl(encodedField.field);
-        fieldAccessInfoCollection.extend(encodedField.field, info);
+        info = new FieldAccessInfoImpl(encodedField.getReference());
+        fieldAccessInfoCollection.extend(encodedField.getReference(), info);
       }
 
       // If `field` is an indirect reference, then create a mapping for it, such that we don't have
       // to resolve the field the next time we see the reference.
-      if (field != encodedField.field) {
+      if (field != encodedField.getReference()) {
         fieldAccessInfoCollection.extend(field, info);
       }
     } else if (info == MISSING_FIELD_ACCESS_INFO) {
@@ -2122,7 +2122,7 @@
     // targets another default method in the same interface (see testInvokeSpecialToDefault-
     // Method). In a class, that would lead to a verification error.
     if (encodedMethod.isNonPrivateVirtualMethod()
-        && virtualMethodsTargetedByInvokeDirect.add(encodedMethod.method)) {
+        && virtualMethodsTargetedByInvokeDirect.add(encodedMethod.getReference())) {
       workList.enqueueMarkMethodLiveAction(method, context, reason);
     }
   }
@@ -2442,7 +2442,7 @@
       markVirtualMethodAsLive(
           resolutionMethod,
           graphReporter.reportReachableMethodAsLive(
-              resolutionMethod.getDefinition().method, resolutionMethod));
+              resolutionMethod.getDefinition().getReference(), resolutionMethod));
       return;
     }
     // Otherwise, we set the initial holder type to be the holder of the reachable method, which
@@ -2456,7 +2456,7 @@
           lookup,
           programMethod ->
               graphReporter.reportReachableMethodAsLive(
-                  resolutionMethod.getDefinition().method, programMethod));
+                  resolutionMethod.getDefinition().getReference(), programMethod));
     }
   }
 
@@ -2474,7 +2474,9 @@
       // Note: It would be reasonable to not process methods already seen during the marking of
       // program usages, but that would cause the methods to not be marked as library overrides.
       markLibraryOrClasspathOverrideLive(
-          instantiation, libraryClass, appInfo.resolveMethodOn(libraryClass, method.method));
+          instantiation,
+          libraryClass,
+          appInfo.resolveMethodOn(libraryClass, method.getReference()));
 
       // Due to API conversion, some overrides can be hidden since they will be rewritten. See
       // class comment of DesugaredLibraryAPIConverter and vivifiedType logic.
@@ -2482,11 +2484,12 @@
       // maintains the library override. In the second enqueuer phase, the signature has been
       // desugared, and the second resolution maintains the the library override.
       if (instantiation.isClass()
-          && appView.rewritePrefix.hasRewrittenTypeInSignature(method.method.proto, appView)) {
+          && appView.rewritePrefix.hasRewrittenTypeInSignature(
+              method.getReference().proto, appView)) {
         DexMethod methodToResolve =
             DesugaredLibraryAPIConverter.methodWithVivifiedTypeInSignature(
-                method.method, method.getHolderType(), appView);
-        assert methodToResolve != method.method;
+                method.getReference(), method.getHolderType(), appView);
+        assert methodToResolve != method.getReference();
         markLibraryOrClasspathOverrideLive(
             instantiation,
             libraryClass,
@@ -2514,7 +2517,7 @@
     if (instantiation.isClass()) {
       // TODO(b/149976493): We need to mark these for lambdas too!
       markOverridesAsLibraryMethodOverrides(
-          instantiation.asClass(), lookup.asMethodTarget().getDefinition().method);
+          instantiation.asClass(), lookup.asMethodTarget().getDefinition().getReference());
     }
   }
 
@@ -2688,7 +2691,7 @@
   }
 
   public boolean isFieldReferenced(DexEncodedField field) {
-    FieldAccessInfoImpl info = fieldAccessInfoCollection.get(field.field);
+    FieldAccessInfoImpl info = fieldAccessInfoCollection.get(field.getReference());
     return info != null;
   }
 
@@ -2834,7 +2837,7 @@
                     target,
                     programMethod ->
                         graphReporter.reportReachableMethodAsLive(
-                            resolvedMethod.method, programMethod)));
+                            resolvedMethod.getReference(), programMethod)));
   }
 
   private void markVirtualDispatchTargetAsLive(
@@ -2874,7 +2877,7 @@
         method -> {
           DexProgramClass clazz = getProgramClassOrNull(method.getHolderType(), context);
           if (clazz != null) {
-            failedMethodResolutionTargets.add(method.method);
+            failedMethodResolutionTargets.add(method.getReference());
             markMethodAsTargeted(new ProgramMethod(clazz, method), reason);
           }
         });
@@ -2920,7 +2923,7 @@
     // If invoke target is invalid (inaccessible or not an instance-method) record it and stop.
     DexClassAndMethod target = resolution.lookupInvokeSuperTarget(from.getHolder(), appInfo);
     if (target == null) {
-      failedMethodResolutionTargets.add(resolution.getResolvedMethod().method);
+      failedMethodResolutionTargets.add(resolution.getResolvedMethod().getReference());
       return;
     }
 
@@ -2961,7 +2964,7 @@
     MainDexInfo.Builder builder = appView.appInfo().getMainDexInfo().builder();
     liveTypes.getItems().forEach(builder::addRoot);
     if (mode.isInitialMainDexTracing()) {
-      liveMethods.getItems().forEach(method -> builder.addRoot(method.method));
+      liveMethods.getItems().forEach(method -> builder.addRoot(method.getReference()));
     } else {
       assert appView.appInfo().getMainDexInfo().isTracedMethodRootsCleared()
           || mode.isGenerateMainDexList();
@@ -3115,7 +3118,7 @@
     }
 
     void addLiveMethod(ProgramMethod method) {
-      DexMethod signature = method.getDefinition().method;
+      DexMethod signature = method.getDefinition().getReference();
       assert !liveMethods.containsKey(signature);
       liveMethods.put(signature, method);
     }
@@ -3399,7 +3402,7 @@
         : "Expected type to be in live non-program types: " + clazz;
     for (DexEncodedField field : clazz.fields()) {
       if (clazz.isNotProgramClass() || isFieldReferenced(field)) {
-        assert verifyReferencedType(field.field.type, worklist, app);
+        assert verifyReferencedType(field.getReference().type, worklist, app);
       }
     }
     for (DexEncodedMethod method : clazz.methods()) {
@@ -3412,8 +3415,8 @@
 
   private boolean verifyReferencedMethod(
       DexEncodedMethod method, WorkList<DexClass> worklist, DexApplication app) {
-    assert verifyReferencedType(method.method.proto.returnType, worklist, app);
-    for (DexType param : method.method.proto.parameters.values) {
+    assert verifyReferencedType(method.getReference().proto.returnType, worklist, app);
+    for (DexType param : method.getReference().proto.parameters.values) {
       assert verifyReferencedType(param, worklist, app);
     }
     return true;
@@ -3644,16 +3647,19 @@
       return;
     }
     if (methodToKeep != singleTarget
-        && !syntheticInterfaceMethodBridges.containsKey(methodToKeep.getDefinition().method)) {
-      syntheticInterfaceMethodBridges.put(methodToKeep.getDefinition().method, methodToKeep);
-      assert null == methodToKeep.getHolder().lookupMethod(methodToKeep.getDefinition().method);
+        && !syntheticInterfaceMethodBridges.containsKey(
+            methodToKeep.getDefinition().getReference())) {
+      syntheticInterfaceMethodBridges.put(
+          methodToKeep.getDefinition().getReference(), methodToKeep);
+      assert null
+          == methodToKeep.getHolder().lookupMethod(methodToKeep.getDefinition().getReference());
       if (singleTargetMethod.isLibraryMethodOverride().isTrue()) {
         methodToKeep.getDefinition().setLibraryMethodOverride(OptionalBool.TRUE);
       }
       DexProgramClass singleTargetHolder = singleTarget.getHolder();
       assert singleTargetHolder.isInterface();
       markVirtualMethodAsReachable(
-          singleTargetMethod.method,
+          singleTargetMethod.getReference(),
           singleTargetHolder.isInterface(),
           singleTarget,
           graphReporter.fakeReportShouldNotBeUsed());
@@ -3748,7 +3754,7 @@
       DexProgramClass current = worklist.removeFirst();
       assert visited.contains(current);
 
-      if (current.lookupVirtualMethod(method.method) != null) {
+      if (current.lookupVirtualMethod(method.getReference()) != null) {
         continue;
       }
 
@@ -4482,7 +4488,7 @@
       DexEncodedMethod target = holder.lookupDirectMethod(method);
       if (target != null) {
         // There is no dispatch on annotations, so only keep what is directly referenced.
-        if (target.method == method) {
+        if (target.getReference() == method) {
           markDirectStaticOrConstructorMethodAsLive(
               new ProgramMethod(holder, target),
               KeepReason.referencedInAnnotation(annotationHolder));
@@ -4490,7 +4496,7 @@
       } else {
         target = holder.lookupVirtualMethod(method);
         // There is no dispatch on annotations, so only keep what is directly referenced.
-        if (target != null && target.method == method) {
+        if (target != null && target.getReference() == method) {
           markMethodAsTargeted(
               new ProgramMethod(holder, target),
               KeepReason.referencedInAnnotation(annotationHolder));
diff --git a/src/main/java/com/android/tools/r8/shaking/GraphReporter.java b/src/main/java/com/android/tools/r8/shaking/GraphReporter.java
index 6459b7f..ac0d153 100644
--- a/src/main/java/com/android/tools/r8/shaking/GraphReporter.java
+++ b/src/main/java/com/android/tools/r8/shaking/GraphReporter.java
@@ -136,7 +136,7 @@
     }
     KeepRuleGraphNode ruleNode = getKeepRuleGraphNode(precondition, rule);
     EdgeKind edgeKind = reportPrecondition(ruleNode);
-    return reportEdge(ruleNode, getMethodGraphNode(method.method), edgeKind);
+    return reportEdge(ruleNode, getMethodGraphNode(method.getReference()), edgeKind);
   }
 
   KeepReasonWitness reportKeepMethod(
@@ -157,7 +157,7 @@
     }
     KeepRuleGraphNode ruleNode = getKeepRuleGraphNode(precondition, rule);
     EdgeKind edgeKind = reportPrecondition(ruleNode);
-    return reportEdge(ruleNode, getFieldGraphNode(field.field), edgeKind);
+    return reportEdge(ruleNode, getFieldGraphNode(field.getReference()), edgeKind);
   }
 
   KeepReasonWitness reportKeepField(
@@ -259,10 +259,11 @@
 
   public KeepReasonWitness reportReachableMethodAsLive(
       DexMethod overriddenMethod, ProgramMethod derivedMethod) {
-    if (keptGraphConsumer != null && overriddenMethod != derivedMethod.getDefinition().method) {
+    if (keptGraphConsumer != null
+        && overriddenMethod != derivedMethod.getDefinition().getReference()) {
       return reportEdge(
           getMethodGraphNode(overriddenMethod),
-          getMethodGraphNode(derivedMethod.getDefinition().method),
+          getMethodGraphNode(derivedMethod.getDefinition().getReference()),
           EdgeKind.OverridingMethod);
     }
     return KeepReasonWitness.INSTANCE;
@@ -276,7 +277,7 @@
     if (keptGraphConsumer != null && instantiation.isClass()) {
       return reportEdge(
           getClassGraphNode(instantiation.asClass().type),
-          getMethodGraphNode(derivedMethod.getDefinition().method),
+          getMethodGraphNode(derivedMethod.getDefinition().getReference()),
           EdgeKind.IsLibraryMethod);
     }
     return KeepReasonWitness.INSTANCE;
@@ -299,8 +300,8 @@
       return KeepReasonWitness.INSTANCE;
     }
     return reportEdge(
-        getMethodGraphNode(definition.method),
-        getMethodGraphNode(implementation.method),
+        getMethodGraphNode(definition.getReference()),
+        getMethodGraphNode(implementation.getReference()),
         EdgeKind.CompanionMethod);
   }
 
@@ -375,14 +376,14 @@
       // TODO(b/120959039): This should be dead code once no library classes are ever enqueued.
       return KeepReasonWitness.INSTANCE;
     }
-    return registerEdge(getMethodGraphNode(method.method), reason);
+    return registerEdge(getMethodGraphNode(method.getReference()), reason);
   }
 
   public KeepReasonWitness registerField(DexEncodedField field, KeepReason reason) {
     if (skipReporting(reason)) {
       return KeepReasonWitness.INSTANCE;
     }
-    return registerEdge(getFieldGraphNode(field.field), reason);
+    return registerEdge(getFieldGraphNode(field.getReference()), reason);
   }
 
   private KeepReasonWitness registerEdge(GraphNode target, KeepReason reason) {
diff --git a/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java b/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
index e843d0d..aa6844e 100644
--- a/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
+++ b/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
@@ -235,7 +235,7 @@
                 (enqueuer.isFieldLive(f)
                         || enqueuer.isFieldReferenced(f)
                         || f.getOptimizationInfo().valueHasBeenPropagated())
-                    && appView.graphLens().getOriginalFieldSignature(f.field).holder
+                    && appView.graphLens().getOriginalFieldSignature(f.getReference()).holder
                         == sourceClass.type));
     Iterables.addAll(
         filteredMembers,
@@ -244,7 +244,7 @@
                 (enqueuer.isMethodLive(m)
                         || enqueuer.isMethodTargeted(m)
                         || m.getOptimizationInfo().returnValueHasBeenPropagated())
-                    && appView.graphLens().getOriginalMethodSignature(m.method).holder
+                    && appView.graphLens().getOriginalMethodSignature(m.getReference()).holder
                         == sourceClass.type));
 
     // If the number of member rules to hold is more than live members, we can't make it.
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java b/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
index 81239aa..7e9b166 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
@@ -307,13 +307,13 @@
     @Override
     public KeepMethodInfo getMethodInfo(DexEncodedMethod method, DexProgramClass holder) {
       assert method.getHolderType() == holder.type;
-      return keepMethodInfo.getOrDefault(method.method, KeepMethodInfo.bottom());
+      return keepMethodInfo.getOrDefault(method.getReference(), KeepMethodInfo.bottom());
     }
 
     @Override
     public KeepFieldInfo getFieldInfo(DexEncodedField field, DexProgramClass holder) {
       assert field.getHolderType() == holder.type;
-      return keepFieldInfo.getOrDefault(field.field, KeepFieldInfo.bottom());
+      return keepFieldInfo.getOrDefault(field.getReference(), KeepFieldInfo.bottom());
     }
 
     public void joinClass(DexProgramClass clazz, Consumer<KeepClassInfo.Joiner> fn) {
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepReason.java b/src/main/java/com/android/tools/r8/shaking/KeepReason.java
index 53b944f..5e6b3fd 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepReason.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepReason.java
@@ -96,12 +96,12 @@
     abstract String getKind();
 
     public DexMethod getMethod() {
-      return method.method;
+      return method.getReference();
     }
 
     @Override
     public GraphNode getSourceNode(GraphReporter graphReporter) {
-      return graphReporter.getMethodGraphNode(method.method);
+      return graphReporter.getMethodGraphNode(method.getReference());
     }
   }
 
@@ -264,10 +264,10 @@
       if (holder.isDexClass()) {
         return graphReporter.getClassGraphNode(holder.asDexClass().type);
       } else if (holder.isDexEncodedField()) {
-        return graphReporter.getFieldGraphNode(holder.asDexEncodedField().field);
+        return graphReporter.getFieldGraphNode(holder.asDexEncodedField().getReference());
       } else {
         assert holder.isDexEncodedMethod();
-        return graphReporter.getMethodGraphNode(holder.asDexEncodedMethod().method);
+        return graphReporter.getMethodGraphNode(holder.asDexEncodedMethod().getReference());
       }
     }
   }
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
index 7760062..ab19637 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
@@ -53,7 +53,7 @@
           clazz.annotations(), appInfo.dexItemFactory())) {
         traceAnnotationsDirectDependencies(clazz.annotations());
       }
-      clazz.forEachField(field -> consumer.accept(field.field.type));
+      clazz.forEachField(field -> consumer.accept(field.getReference().type));
       clazz.forEachProgramMethodMatching(
           definition -> {
             traceMethodDirectDependencies(definition.getReference(), consumer);
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
index afb39bf..525417c 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
@@ -105,7 +105,7 @@
         // Browse annotation values types in search for enum.
         // Each annotation value is represented by a virtual method.
         for (DexEncodedMethod method : clazz.virtualMethods()) {
-          DexProto proto = method.method.proto;
+          DexProto proto = method.getReference().proto;
           if (proto.parameters.isEmpty()) {
             DexType valueType = proto.returnType.toBaseType(appView.dexItemFactory());
             if (valueType.isClassType()) {
@@ -143,7 +143,7 @@
     addDirectDependency(clazz);
     // Add enum classes used for values as direct dependencies.
     for (DexEncodedMethod method : clazz.virtualMethods()) {
-      DexProto proto = method.method.proto;
+      DexProto proto = method.getReference().proto;
       if (proto.parameters.isEmpty()) {
         DexType valueType = proto.returnType.toBaseType(appView.dexItemFactory());
         if (isEnum(valueType)) {
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
index c6afc11..8c0d0b4 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
@@ -75,11 +75,13 @@
     memberRuleBuilder.setRuleType(ProguardMemberType.METHOD);
     memberRuleBuilder.getAccessFlags().setFlags(method.accessFlags);
     memberRuleBuilder.setName(
-        IdentifierPatternWithWildcards.withoutWildcards(method.method.name.toString()));
-    memberRuleBuilder.setTypeMatcher(ProguardTypeMatcher.create(method.method.proto.returnType));
-    List<ProguardTypeMatcher> arguments = Arrays.stream(method.method.proto.parameters.values)
-        .map(ProguardTypeMatcher::create)
-        .collect(Collectors.toList());
+        IdentifierPatternWithWildcards.withoutWildcards(method.getReference().name.toString()));
+    memberRuleBuilder.setTypeMatcher(
+        ProguardTypeMatcher.create(method.getReference().proto.returnType));
+    List<ProguardTypeMatcher> arguments =
+        Arrays.stream(method.getReference().proto.parameters.values)
+            .map(ProguardTypeMatcher::create)
+            .collect(Collectors.toList());
     memberRuleBuilder.setArguments(arguments);
     builder.getMemberRules().add(memberRuleBuilder.build());
     return builder.build();
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java b/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java
index df5bdd1..2aba15e 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java
@@ -185,7 +185,8 @@
       AppView<?> appView,
       Consumer<AnnotationMatchResult> matchedAnnotationsConsumer,
       DexStringCache stringCache) {
-    DexField originalSignature = appView.graphLens().getOriginalFieldSignature(field.field);
+    DexField originalSignature =
+        appView.graphLens().getOriginalFieldSignature(field.getReference());
     switch (getRuleType()) {
       case ALL:
       case ALL_FIELDS:
@@ -236,7 +237,8 @@
       AppView<?> appView,
       Consumer<AnnotationMatchResult> matchedAnnotationsConsumer,
       DexStringCache stringCache) {
-    DexMethod originalSignature = appView.graphLens().getOriginalMethodSignature(method.method);
+    DexMethod originalSignature =
+        appView.graphLens().getOriginalMethodSignature(method.getReference());
     switch (getRuleType()) {
       case ALL_METHODS:
         if (method.isClassInitializer()) {
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
index 8848ece..e78f53b 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -387,8 +387,8 @@
           assert !encodedMethod.shouldNotHaveCode();
           continue;
         }
-        propagateAssumeRules(clazz.type, encodedMethod.method, subTypes, noSideEffects);
-        propagateAssumeRules(clazz.type, encodedMethod.method, subTypes, assumedValues);
+        propagateAssumeRules(clazz.type, encodedMethod.getReference(), subTypes, noSideEffects);
+        propagateAssumeRules(clazz.type, encodedMethod.getReference(), subTypes, assumedValues);
       }
     }
 
@@ -414,7 +414,7 @@
         if (target == null || target.getHolderType() == type) {
           continue;
         }
-        ProguardMemberRule ruleInSubType = assumeRulePool.get(target.method);
+        ProguardMemberRule ruleInSubType = assumeRulePool.get(target.getReference());
         // We are looking for the greatest lower bound of assume rules from all sub types.
         // If any subtype doesn't have a matching assume rule, the lower bound is literally nothing.
         if (ruleInSubType == null) {
@@ -578,7 +578,7 @@
         }
         for (DexEncodedMethod method : clazz.virtualMethods()) {
           // Check if we already added this.
-          Wrapper<DexMethod> wrapped = MethodSignatureEquivalence.get().wrap(method.method);
+          Wrapper<DexMethod> wrapped = MethodSignatureEquivalence.get().wrap(method.getReference());
           if (!seenMethods.add(wrapped)) {
             continue;
           }
@@ -592,7 +592,10 @@
 
       private void tryAndKeepMethodOnClass(DexEncodedMethod method, ProguardMemberRule rule) {
         SingleResolutionResult resolutionResult =
-            appView.appInfo().resolveMethodOn(originalClazz, method.method).asSingleResolution();
+            appView
+                .appInfo()
+                .resolveMethodOn(originalClazz, method.getReference())
+                .asSingleResolution();
         if (resolutionResult == null || !resolutionResult.isVirtualTarget()) {
           return;
         }
@@ -1008,7 +1011,7 @@
         DexDefinition precondition,
         ProguardIfRule ifRule) {
       if (methodsMarked != null
-          && methodsMarked.contains(MethodSignatureEquivalence.get().wrap(method.method))) {
+          && methodsMarked.contains(MethodSignatureEquivalence.get().wrap(method.getReference()))) {
         // Ignore, method is overridden in sub class.
         return;
       }
@@ -1019,7 +1022,7 @@
                 getClass(), "Marking method `%s` due to `%s { %s }`.", method, context, rule);
           }
           if (methodsMarked != null) {
-            methodsMarked.add(MethodSignatureEquivalence.get().wrap(method.method));
+            methodsMarked.add(MethodSignatureEquivalence.get().wrap(method.getReference()));
           }
           addItemToSets(method, context, rule, precondition, ifRule);
         }
@@ -1075,13 +1078,13 @@
 
     private void includeDescriptorClasses(DexDefinition item, ProguardKeepRuleBase context) {
       if (item.isDexEncodedMethod()) {
-        DexMethod method = item.asDexEncodedMethod().method;
+        DexMethod method = item.asDexEncodedMethod().getReference();
         includeDescriptor(item, method.proto.returnType, context);
         for (DexType value : method.proto.parameters.values) {
           includeDescriptor(item, value, context);
         }
       } else if (item.isDexEncodedField()) {
-        DexField field = item.asDexEncodedField().field;
+        DexField field = item.asDexEncodedField().getReference();
         includeDescriptor(item, field.type, context);
       } else {
         assert item.isDexClass();
@@ -1114,7 +1117,7 @@
             return;
           }
           if (options.isGeneratingDex()
-              && encodedMethod.method.isLambdaDeserializeMethod(appView.dexItemFactory())) {
+              && encodedMethod.getReference().isLambdaDeserializeMethod(appView.dexItemFactory())) {
             // Don't keep lambda deserialization methods.
             return;
           }
@@ -1131,7 +1134,7 @@
                         "The rule `"
                             + rule
                             + "` is ignored because the targeting interface method `"
-                            + encodedMethod.method.toSourceString()
+                            + encodedMethod.getReference().toSourceString()
                             + "` will be desugared."));
               }
               return;
@@ -1244,7 +1247,7 @@
         if (!item.isDexEncodedMethod()) {
           throw new Unreachable();
         }
-        whyAreYouNotInlining.add(item.asDexEncodedMethod().method);
+        whyAreYouNotInlining.add(item.asDexEncodedMethod().getReference());
         context.markAsUsed();
       } else if (context.isClassInlineRule()) {
         ClassInlineRule classInlineRule = context.asClassInlineRule();
@@ -1285,13 +1288,13 @@
             if (item.isDexEncodedField()) {
               DexEncodedField field = item.asDexEncodedField();
               if (field.isProgramField(appView)) {
-                neverPropagateValue.add(item.asDexEncodedField().field);
+                neverPropagateValue.add(item.asDexEncodedField().getReference());
                 context.markAsUsed();
               }
             } else if (item.isDexEncodedMethod()) {
               DexEncodedMethod method = item.asDexEncodedMethod();
               if (method.isProgramMethod(appView)) {
-                neverPropagateValue.add(item.asDexEncodedMethod().method);
+                neverPropagateValue.add(item.asDexEncodedMethod().getReference());
                 context.markAsUsed();
               }
             }
@@ -1301,15 +1304,15 @@
         }
       } else if (context instanceof ProguardIdentifierNameStringRule) {
         if (item.isDexEncodedField()) {
-          identifierNameStrings.add(item.asDexEncodedField().field);
+          identifierNameStrings.add(item.asDexEncodedField().getReference());
           context.markAsUsed();
         } else if (item.isDexEncodedMethod()) {
-          identifierNameStrings.add(item.asDexEncodedMethod().method);
+          identifierNameStrings.add(item.asDexEncodedMethod().getReference());
           context.markAsUsed();
         }
       } else if (context instanceof ConstantArgumentRule) {
         if (item.isDexEncodedMethod()) {
-          keepParametersWithConstantValue.add(item.asDexEncodedMethod().method);
+          keepParametersWithConstantValue.add(item.asDexEncodedMethod().getReference());
           context.markAsUsed();
         }
       } else if (context instanceof ReprocessClassInitializerRule) {
@@ -1317,10 +1320,10 @@
         if (clazz != null && clazz.hasClassInitializer()) {
           switch (context.asReprocessClassInitializerRule().getType()) {
             case ALWAYS:
-              reprocess.add(clazz.getClassInitializer().method);
+              reprocess.add(clazz.getClassInitializer().getReference());
               break;
             case NEVER:
-              neverReprocess.add(clazz.getClassInitializer().method);
+              neverReprocess.add(clazz.getClassInitializer().getReference());
               break;
             default:
               throw new Unreachable();
@@ -1332,10 +1335,10 @@
           DexEncodedMethod method = item.asDexEncodedMethod();
           switch (context.asReprocessMethodRule().getType()) {
             case ALWAYS:
-              reprocess.add(method.method);
+              reprocess.add(method.getReference());
               break;
             case NEVER:
-              neverReprocess.add(method.method);
+              neverReprocess.add(method.getReference());
               break;
             default:
               throw new Unreachable();
@@ -1344,7 +1347,7 @@
         }
       } else if (context instanceof UnusedArgumentRule) {
         if (item.isDexEncodedMethod()) {
-          keepUnusedArguments.add(item.asDexEncodedMethod().method);
+          keepUnusedArguments.add(item.asDexEncodedMethod().getReference());
           context.markAsUsed();
         }
       } else {
diff --git a/src/main/java/com/android/tools/r8/shaking/ScopedDexMethodSet.java b/src/main/java/com/android/tools/r8/shaking/ScopedDexMethodSet.java
index d3b7e21..07ad580 100644
--- a/src/main/java/com/android/tools/r8/shaking/ScopedDexMethodSet.java
+++ b/src/main/java/com/android/tools/r8/shaking/ScopedDexMethodSet.java
@@ -46,7 +46,7 @@
   }
 
   public boolean addMethod(DexEncodedMethod method) {
-    Wrapper<DexMethod> wrapped = METHOD_EQUIVALENCE.wrap(method.method);
+    Wrapper<DexMethod> wrapped = METHOD_EQUIVALENCE.wrap(method.getReference());
     if (contains(wrapped)) {
       return false;
     }
@@ -55,7 +55,7 @@
   }
 
   public AddMethodIfMoreVisibleResult addMethodIfMoreVisible(DexEncodedMethod method) {
-    Wrapper<DexMethod> wrapped = METHOD_EQUIVALENCE.wrap(method.method);
+    Wrapper<DexMethod> wrapped = METHOD_EQUIVALENCE.wrap(method.getReference());
     DexEncodedMethod existing = lookup(wrapped);
     if (existing == null) {
       items.put(wrapped, method);
diff --git a/src/main/java/com/android/tools/r8/shaking/TreePruner.java b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
index 9b7a66b..6974a61 100644
--- a/src/main/java/com/android/tools/r8/shaking/TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
@@ -276,7 +276,7 @@
     AppInfoWithLiveness appInfo = appView.appInfo();
     InternalOptions options = appView.options();
     int firstUnreachable =
-        firstUnreachableIndex(methods, method -> appInfo.isLiveMethod(method.method));
+        firstUnreachableIndex(methods, method -> appInfo.isLiveMethod(method.getReference()));
     // Return the original array if all methods are used.
     if (firstUnreachable == -1) {
       return null;
@@ -295,7 +295,7 @@
             method.shouldNotHaveCode() && !method.hasCode()
                 ? method
                 : method.toMethodThatLogsError(appView));
-        methodsToKeepForConfigurationDebugging.add(method.method);
+        methodsToKeepForConfigurationDebugging.add(method.getReference());
       } else if (appInfo.isTargetedMethod(method.getReference())) {
         // If the method is already abstract, and doesn't have code, let it be.
         if (method.shouldNotHaveCode() && !method.hasCode()) {
@@ -303,7 +303,7 @@
           continue;
         }
         if (Log.ENABLED) {
-          Log.debug(getClass(), "Making method %s abstract.", method.method);
+          Log.debug(getClass(), "Making method %s abstract.", method.getReference());
         }
         // Final classes cannot be abstract, so we have to keep the method in that case.
         // Also some other kinds of methods cannot be abstract, so keep them around.
@@ -315,7 +315,7 @@
                 && !method.isSynchronized()
                 && !method.accessFlags.isPrivate()
                 && !method.isStatic()
-                && !appInfo.isFailedResolutionTarget(method.method);
+                && !appInfo.isFailedResolutionTarget(method.getReference());
         // Private methods and static methods can only be targeted yet non-live as the result of
         // an invalid invoke. They will not actually be called at runtime but we have to keep them
         // as non-abstract (see above) to produce the same failure mode.
@@ -323,7 +323,7 @@
             allowAbstract ? method.toAbstractMethod() : method.toEmptyThrowingMethod(options));
       } else {
         if (Log.ENABLED) {
-          Log.debug(getClass(), "Removing method %s.", method.method);
+          Log.debug(getClass(), "Removing method %s.", method.getReference());
         }
         unusedItemsPrinter.registerUnusedMethod(method);
       }
@@ -356,7 +356,7 @@
         reachableOrReferencedFields.add(field);
       } else {
         if (Log.ENABLED) {
-          Log.debug(getClass(), "Removing field %s.", field.field);
+          Log.debug(getClass(), "Removing field %s.", field.getReference());
         }
         unusedItemsPrinter.registerUnusedField(field);
       }
@@ -379,7 +379,7 @@
       // Pinned field which type is never instantiated are always null, they are marked as dead
       // so their reads and writes are cleared, but they are still in the program.
       assert !field.getOptimizationInfo().isDead() || appView.appInfo().isPinned(field)
-          : "Expected field `" + field.field.toSourceString() + "` to be absent";
+          : "Expected field `" + field.getReference().toSourceString() + "` to be absent";
     }
     return true;
   }
diff --git a/src/main/java/com/android/tools/r8/shaking/UnusedItemsPrinter.java b/src/main/java/com/android/tools/r8/shaking/UnusedItemsPrinter.java
index 5b89abf..6bd61cd 100644
--- a/src/main/java/com/android/tools/r8/shaking/UnusedItemsPrinter.java
+++ b/src/main/java/com/android/tools/r8/shaking/UnusedItemsPrinter.java
@@ -105,15 +105,15 @@
       append(accessFlags);
       append(" ");
     }
-    append(method.method.proto.returnType.toSourceString());
+    append(method.getReference().proto.returnType.toSourceString());
     append(" ");
-    append(method.method.name.toSourceString());
+    append(method.getReference().name.toSourceString());
     append("(");
-    for (int i = 0; i < method.method.proto.parameters.values.length; i++) {
+    for (int i = 0; i < method.getReference().proto.parameters.values.length; i++) {
       if (i != 0) {
         append(",");
       }
-      append(method.method.proto.parameters.values[i].toSourceString());
+      append(method.getReference().proto.parameters.values[i].toSourceString());
     }
     append(")");
     newline();
@@ -126,9 +126,9 @@
       append(accessFlags);
       append(" ");
     }
-    append(field.field.type.toSourceString());
+    append(field.getReference().type.toSourceString());
     append(" ");
-    append(field.field.name.toSourceString());
+    append(field.getReference().name.toSourceString());
     newline();
   }
 
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index b2d9332..3475116 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -512,7 +512,7 @@
       }
       // Check if the target is overriding and narrowing the access.
       if (method.isPublic()) {
-        DexEncodedMethod targetOverride = target.lookupVirtualMethod(method.method);
+        DexEncodedMethod targetOverride = target.lookupVirtualMethod(method.getReference());
         if (targetOverride != null && !targetOverride.isPublic()) {
           return true;
         }
@@ -565,7 +565,7 @@
       Set<Wrapper<DexMethod>> filteredSignatures = new HashSet<>();
       for (DexProgramClass clazz : appInfo.classes()) {
         for (DexEncodedMethod encodedMethod : clazz.methods()) {
-          DexMethod method = encodedMethod.method;
+          DexMethod method = encodedMethod.getReference();
           DexClass definition = appInfo.definitionFor(method.holder);
           if (definition != null
               && definition.isProgramClass()
@@ -695,7 +695,7 @@
 
     for (DexProgramClass clazz : appInfo.classes()) {
       for (DexEncodedMethod encodedMethod : clazz.methods()) {
-        DexMethod method = encodedMethod.method;
+        DexMethod method = encodedMethod.getReference();
         DexMethod originalMethod = graphLens.getOriginalMethodSignature(method);
         DexMethod renamedMethod = graphLens.getRenamedMethodSignature(originalMethod);
 
@@ -727,7 +727,8 @@
 
   private boolean methodResolutionMayChange(DexProgramClass source, DexProgramClass target) {
     for (DexEncodedMethod virtualSourceMethod : source.virtualMethods()) {
-      DexEncodedMethod directTargetMethod = target.lookupDirectMethod(virtualSourceMethod.method);
+      DexEncodedMethod directTargetMethod =
+          target.lookupDirectMethod(virtualSourceMethod.getReference());
       if (directTargetMethod != null) {
         // A private method shadows a virtual method. This situation is rare, since it is not
         // allowed by javac. Therefore, we just give up in this case. (In principle, it would be
@@ -763,7 +764,7 @@
         // Conservatively find all possible targets for this method.
         LookupResultSuccess lookupResult =
             appInfo
-                .resolveMethodOnInterface(method.getHolderType(), method.method)
+                .resolveMethodOnInterface(method.getHolderType(), method.getReference())
                 .lookupVirtualDispatchTargets(target, appInfo)
                 .asLookupResultSuccess();
         assert lookupResult != null;
@@ -873,11 +874,12 @@
       for (DexType interfaceType : target.interfaces.values) {
         DexClass clazz = appInfo.definitionFor(interfaceType);
         for (DexEncodedField staticField : clazz.staticFields()) {
-          staticFieldsInInterfacesOfTarget.add(equivalence.wrap(staticField.field));
+          staticFieldsInInterfacesOfTarget.add(equivalence.wrap(staticField.getReference()));
         }
       }
       for (DexEncodedField instanceField : source.instanceFields()) {
-        if (staticFieldsInInterfacesOfTarget.contains(equivalence.wrap(instanceField.field))) {
+        if (staticFieldsInInterfacesOfTarget.contains(
+            equivalence.wrap(instanceField.getReference()))) {
           // An instruction "iget Target.f" or "iput Target.f" that used to hit a static field in an
           // interface would now hit an instance field from [source], so that an IncompatibleClass-
           // ChangeError would no longer be thrown. Abort merge.
@@ -926,7 +928,7 @@
           DexEncodedMethod resultingConstructor =
               renameConstructor(directMethod, availableMethodSignatures);
           add(directMethods, resultingConstructor, MethodSignatureEquivalence.get());
-          blockRedirectionOfSuperCalls(resultingConstructor.method);
+          blockRedirectionOfSuperCalls(resultingConstructor.getReference());
         } else {
           DexEncodedMethod resultingDirectMethod =
               renameMethod(
@@ -934,9 +936,10 @@
                   availableMethodSignatures,
                   directMethod.isClassInitializer() ? Rename.NEVER : Rename.IF_NEEDED);
           add(directMethods, resultingDirectMethod, MethodSignatureEquivalence.get());
-          deferredRenamings.map(directMethod.method, resultingDirectMethod.method);
-          deferredRenamings.recordMove(directMethod.method, resultingDirectMethod.method);
-          blockRedirectionOfSuperCalls(resultingDirectMethod.method);
+          deferredRenamings.map(directMethod.getReference(), resultingDirectMethod.getReference());
+          deferredRenamings.recordMove(
+              directMethod.getReference(), resultingDirectMethod.getReference());
+          blockRedirectionOfSuperCalls(resultingDirectMethod.getReference());
         }
       }
 
@@ -945,7 +948,7 @@
         if (shadowedBy != null) {
           if (virtualMethod.isAbstract()) {
             // Remove abstract/interface methods that are shadowed.
-            deferredRenamings.map(virtualMethod.method, shadowedBy.method);
+            deferredRenamings.map(virtualMethod.getReference(), shadowedBy.getReference());
 
             // The override now corresponds to the method in the parent, so unset its synthetic flag
             // if the method in the parent is not synthetic.
@@ -977,8 +980,10 @@
                 renameMethod(virtualMethod, availableMethodSignatures, Rename.NEVER);
             resultingVirtualMethod.setLibraryMethodOverride(
                 virtualMethod.isLibraryMethodOverride());
-            deferredRenamings.map(virtualMethod.method, resultingVirtualMethod.method);
-            deferredRenamings.recordMove(virtualMethod.method, resultingVirtualMethod.method);
+            deferredRenamings.map(
+                virtualMethod.getReference(), resultingVirtualMethod.getReference());
+            deferredRenamings.recordMove(
+                virtualMethod.getReference(), resultingVirtualMethod.getReference());
             add(virtualMethods, resultingVirtualMethod, MethodSignatureEquivalence.get());
             continue;
           }
@@ -1005,7 +1010,7 @@
           makeStatic(resultingDirectMethod);
 
           // Update method pool collection now that we are adding a new public method.
-          methodPoolForTarget.seen(resultingDirectMethod.method);
+          methodPoolForTarget.seen(resultingDirectMethod.getReference());
         } else {
           // This virtual method could be called directly from a sub class via an invoke-super in-
           // struction. Therefore, we translate this virtual method into a direct method, such that
@@ -1019,8 +1024,9 @@
 
         // Record that invoke-super instructions in the target class should be redirected to the
         // newly created direct method.
-        redirectSuperCallsInTarget(virtualMethod.method, resultingDirectMethod.method);
-        blockRedirectionOfSuperCalls(resultingDirectMethod.method);
+        redirectSuperCallsInTarget(
+            virtualMethod.getReference(), resultingDirectMethod.getReference());
+        blockRedirectionOfSuperCalls(resultingDirectMethod.getReference());
 
         if (shadowedBy == null) {
           // In addition to the newly added direct method, create a virtual method such that we do
@@ -1029,12 +1035,14 @@
           // it turns out that the method is never used, it will be removed by the final round
           // of tree shaking.
           shadowedBy = buildBridgeMethod(virtualMethod, resultingDirectMethod);
-          deferredRenamings.recordCreationOfBridgeMethod(virtualMethod.method, shadowedBy.method);
+          deferredRenamings.recordCreationOfBridgeMethod(
+              virtualMethod.getReference(), shadowedBy.getReference());
           add(virtualMethods, shadowedBy, MethodSignatureEquivalence.get());
         }
 
-        deferredRenamings.map(virtualMethod.method, shadowedBy.method);
-        deferredRenamings.recordMove(virtualMethod.method, resultingDirectMethod.method);
+        deferredRenamings.map(virtualMethod.getReference(), shadowedBy.getReference());
+        deferredRenamings.recordMove(
+            virtualMethod.getReference(), resultingDirectMethod.getReference());
       }
 
       if (abortMerge) {
@@ -1046,7 +1054,7 @@
       // Step 2: Merge fields
       Set<DexString> existingFieldNames = new HashSet<>();
       for (DexEncodedField field : target.fields()) {
-        existingFieldNames.add(field.field.name);
+        existingFieldNames.add(field.getReference().name);
       }
 
       // In principle, we could allow multiple fields with the same name, and then only rename the
@@ -1223,8 +1231,8 @@
     private DexEncodedMethod buildBridgeMethod(
         DexEncodedMethod method, DexEncodedMethod invocationTarget) {
       DexType holder = target.type;
-      DexProto proto = method.method.proto;
-      DexString name = method.method.name;
+      DexProto proto = method.getReference().proto;
+      DexString name = method.getReference().name;
       DexMethod newMethod = application.dexItemFactory.createMethod(holder, proto, name);
       MethodAccessFlags accessFlags = method.accessFlags.copy();
       accessFlags.setBridge();
@@ -1235,8 +1243,8 @@
       SynthesizedBridgeCode code =
           new SynthesizedBridgeCode(
               newMethod,
-              appView.graphLens().getOriginalMethodSignature(method.method),
-              invocationTarget.method,
+              appView.graphLens().getOriginalMethodSignature(method.getReference()),
+              invocationTarget.getReference(),
               invocationTarget.isPrivateMethod() ? DIRECT : STATIC,
               target.isInterface());
 
@@ -1265,7 +1273,7 @@
 
     // Returns the method that shadows the given method, or null if method is not shadowed.
     private DexEncodedMethod findMethodInTarget(DexEncodedMethod method) {
-      ResolutionResult resolutionResult = appInfo.resolveMethodOn(target, method.method);
+      ResolutionResult resolutionResult = appInfo.resolveMethodOn(target, method.getReference());
       if (!resolutionResult.isSingleResolution()) {
         // May happen in case of missing classes, or if multiple implementations were found.
         abortMerge = true;
@@ -1285,7 +1293,7 @@
               "The non-abstract type `"
                   + target.type.toSourceString()
                   + "` does not implement the method `"
-                  + method.method.toSourceString()
+                  + method.getReference().toSourceString()
                   + "`.");
         }
       }
@@ -1321,8 +1329,8 @@
       int i = 0;
       for (DexEncodedField field : sourceFields) {
         DexEncodedField resultingField = renameFieldIfNeeded(field, availableFieldSignatures);
-        existingFieldNames.add(resultingField.field.name);
-        deferredRenamings.map(field.field, resultingField.field);
+        existingFieldNames.add(resultingField.getReference().name);
+        deferredRenamings.map(field.getReference(), resultingField.getReference());
         result[i] = resultingField;
         i++;
       }
@@ -1354,14 +1362,15 @@
       do {
         DexString newName = getFreshName(TEMPORARY_INSTANCE_INITIALIZER_PREFIX, count, oldHolder);
         newSignature =
-            application.dexItemFactory.createMethod(target.type, method.method.proto, newName);
+            application.dexItemFactory.createMethod(
+                target.type, method.getReference().proto, newName);
         count++;
       } while (!availableMethodSignatures.test(newSignature));
 
       DexEncodedMethod result = method.toTypeSubstitutedMethod(newSignature);
       result.getMutableOptimizationInfo().markForceInline();
-      deferredRenamings.map(method.method, result.method);
-      deferredRenamings.recordMove(method.method, result.method);
+      deferredRenamings.map(method.getReference(), result.getReference());
+      deferredRenamings.recordMove(method.getReference(), result.getReference());
       // Renamed constructors turn into ordinary private functions. They can be private, as
       // they are only references from their direct subclass, which they were merged into.
       result.accessFlags.unsetConstructor();
@@ -1371,7 +1380,7 @@
 
     private DexEncodedMethod renameMethod(
         DexEncodedMethod method, Predicate<DexMethod> availableMethodSignatures, Rename strategy) {
-      return renameMethod(method, availableMethodSignatures, strategy, method.method.proto);
+      return renameMethod(method, availableMethodSignatures, strategy, method.getReference().proto);
     }
 
     private DexEncodedMethod renameMethod(
@@ -1382,7 +1391,7 @@
       // We cannot handle renaming static initializers yet and constructors should have been
       // renamed already.
       assert !method.accessFlags.isConstructor() || strategy == Rename.NEVER;
-      DexString oldName = method.method.name;
+      DexString oldName = method.getReference().name;
       DexType oldHolder = method.getHolderType();
 
       DexMethod newSignature;
@@ -1417,17 +1426,18 @@
 
     private DexEncodedField renameFieldIfNeeded(
         DexEncodedField field, Predicate<DexField> availableFieldSignatures) {
-      DexString oldName = field.field.name;
+      DexString oldName = field.getReference().name;
       DexType oldHolder = field.getHolderType();
 
       DexField newSignature =
-          application.dexItemFactory.createField(target.type, field.field.type, oldName);
+          application.dexItemFactory.createField(target.type, field.getReference().type, oldName);
       if (!availableFieldSignatures.test(newSignature)) {
         int count = 1;
         do {
           DexString newName = getFreshName(oldName.toSourceString(), count, oldHolder);
           newSignature =
-              application.dexItemFactory.createField(target.type, field.field.type, newName);
+              application.dexItemFactory.createField(
+                  target.type, field.getReference().type, newName);
           count++;
         } while (!availableFieldSignatures.test(newSignature));
       }
@@ -1520,7 +1530,7 @@
     @Override
     public DexEncodedMethod recordMethodChange(
         DexEncodedMethod method, DexEncodedMethod newMethod) {
-      recordMethodChange(method.method, newMethod.method);
+      recordMethodChange(method.getReference(), newMethod.getReference());
       if (newMethod.isNonPrivateVirtualMethod()) {
         // Since we changed the return type or one of the parameters, this method cannot be a
         // classpath or library method override, since we only class merge program classes.
diff --git a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
index 039f28d..16a6bfc 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
@@ -301,7 +301,7 @@
       addType(field.type);
       DexEncodedField baseField = appInfo.resolveField(field).getResolvedField();
       if (baseField != null && baseField.getHolderType() != field.holder) {
-        field = baseField.field;
+        field = baseField.getReference();
       }
       addType(field.holder);
       TracedFieldImpl tracedField = new TracedFieldImpl(field, baseField);
@@ -381,9 +381,9 @@
       ResolutionResult resolutionResult = appInfo.unsafeResolveMethodDueToDexFormat(method);
       DexEncodedMethod target =
           resolutionResult.isVirtualTarget() ? resolutionResult.getSingleTarget() : null;
-      if (target != null && target.method != method) {
+      if (target != null && target.getReference() != method) {
         addType(method.holder);
-        addMethod(target.method);
+        addMethod(target.getReference());
       } else {
         addMethod(method);
       }
@@ -397,9 +397,9 @@
     @Override
     public void registerInvokeStatic(DexMethod method) {
       DexEncodedMethod target = appInfo.unsafeResolveMethodDueToDexFormat(method).getSingleTarget();
-      if (target != null && target.method != method) {
+      if (target != null && target.getReference() != method) {
         addType(method.holder);
-        addMethod(target.method);
+        addMethod(target.getReference());
       } else {
         addMethod(method);
       }
@@ -456,7 +456,7 @@
     }
 
     private void registerField(DexEncodedField field) {
-      registerTypeReference(field.field.type);
+      registerTypeReference(field.getReference().type);
     }
 
     private void registerMethod(ProgramMethod method) {
@@ -488,10 +488,11 @@
       clazz.forEachMethod(
           method -> {
             ResolutionResult resolutionResult =
-                appInfo.resolveMethodOn(superType, method.method, superType != clazz.superType);
+                appInfo.resolveMethodOn(
+                    superType, method.getReference(), superType != clazz.superType);
             DexEncodedMethod dexEncodedMethod = resolutionResult.getSingleTarget();
             if (dexEncodedMethod != null) {
-              addMethod(dexEncodedMethod.method);
+              addMethod(dexEncodedMethod.getReference());
             }
           });
     }
diff --git a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
index b1099e1..47ccd91 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -357,11 +357,12 @@
             }
           }
 
-          DexMethod originalMethod = appView.graphLens().getOriginalMethodSignature(method.method);
+          DexMethod originalMethod =
+              appView.graphLens().getOriginalMethodSignature(method.getReference());
           MethodSignature originalSignature =
               MethodSignature.fromDexMethod(originalMethod, originalMethod.holder != originalType);
 
-          DexString obfuscatedNameDexString = namingLens.lookupName(method.method);
+          DexString obfuscatedNameDexString = namingLens.lookupName(method.getReference());
           String obfuscatedName = obfuscatedNameDexString.toString();
 
           // Add simple "a() -> b" mapping if we won't have any other with concrete line numbers
@@ -467,7 +468,7 @@
       }
       allSeenAreInstanceInitializers = false;
       // If the method is pinned, we cannot minify it.
-      if (!keepInfo.isMinificationAllowed(method.method, appView, appView.options())) {
+      if (!keepInfo.isMinificationAllowed(method.getReference(), appView, appView.options())) {
         continue;
       }
       // With desugared library, call-backs names are reserved here.
@@ -477,16 +478,17 @@
       // We use the same name for interface names even if it has different types.
       DexProgramClass clazz = appView.definitionForProgramType(method.getHolderType());
       DexClassAndMethod lookupResult =
-          appView.appInfo().lookupMaximallySpecificMethod(clazz, method.method);
+          appView.appInfo().lookupMaximallySpecificMethod(clazz, method.getReference());
       if (lookupResult == null) {
         // We cannot rename methods we cannot look up.
         continue;
       }
-      String errorString = method.method.qualifiedName() + " is not kept but is overloaded";
+      String errorString = method.getReference().qualifiedName() + " is not kept but is overloaded";
       assert lookupResult.getHolder().isInterface() : errorString;
       // TODO(b/159113601): Reenable assert.
-      assert true || originalName == null || originalName.equals(method.method.name) : errorString;
-      originalName = method.method.name;
+      assert true || originalName == null || originalName.equals(method.getReference().name)
+          : errorString;
+      originalName = method.getReference().name;
     }
     return true;
   }
@@ -544,7 +546,7 @@
       Supplier<Builder> onDemandClassNamingBuilder) {
     clazz.forEachField(
         dexEncodedField -> {
-          DexField dexField = dexEncodedField.field;
+          DexField dexField = dexEncodedField.getReference();
           DexField originalField = graphLens.getOriginalFieldSignature(dexField);
           DexString renamedName = namingLens.lookupName(dexField);
           if (renamedName != originalField.name || originalField.holder != originalType) {
@@ -562,7 +564,7 @@
         new IdentityHashMap<>(clazz.getMethodCollection().size());
     for (DexEncodedMethod encodedMethod : clazz.methods()) {
       // Add method only if renamed, moved, or contains positions.
-      DexMethod method = encodedMethod.method;
+      DexMethod method = encodedMethod.getReference();
       DexString renamedName = namingLens.lookupName(method);
       if (renamedName != method.name
           || graphLens.getOriginalMethodSignature(method) != method
@@ -626,7 +628,7 @@
     PositionEventEmitter positionEventEmitter =
         new PositionEventEmitter(
             application.dexItemFactory,
-            appView.graphLens().getOriginalMethodSignature(method.method),
+            appView.graphLens().getOriginalMethodSignature(method.getReference()),
             processedEvents);
 
     Box<Boolean> inlinedOriginalPosition = new Box<>(false);
@@ -634,7 +636,8 @@
     // Debug event visitor to map line numbers.
     DexDebugEventVisitor visitor =
         new DexDebugPositionState(
-            debugInfo.startLine, appView.graphLens().getOriginalMethodSignature(method.method)) {
+            debugInfo.startLine,
+            appView.graphLens().getOriginalMethodSignature(method.getReference())) {
 
           // Keep track of what PC has been emitted.
           private int emittedPc = 0;
@@ -734,7 +737,7 @@
     Pair<Integer, Position> lastPosition = new Pair<>();
 
     DexDebugEventVisitor visitor =
-        new DexDebugPositionState(debugInfo.startLine, method.method) {
+        new DexDebugPositionState(debugInfo.startLine, method.getReference()) {
           @Override
           public void visit(Default defaultEvent) {
             super.visit(defaultEvent);
diff --git a/src/test/java/com/android/tools/r8/cfmethodgeneration/MethodGenerationBase.java b/src/test/java/com/android/tools/r8/cfmethodgeneration/MethodGenerationBase.java
index fcc79dc..2c58d15 100644
--- a/src/test/java/com/android/tools/r8/cfmethodgeneration/MethodGenerationBase.java
+++ b/src/test/java/com/android/tools/r8/cfmethodgeneration/MethodGenerationBase.java
@@ -111,7 +111,7 @@
                   continue;
                 }
                 String holderName = method.getHolderType().getName();
-                String methodName = method.method.name.toString();
+                String methodName = method.getReference().name.toString();
                 String generatedMethodName = holderName + "_" + methodName;
                 CfCode code = getCode(holderName, methodName, method.getCode().asCfCode());
                 if (code != null) {
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/B141942381.java b/src/test/java/com/android/tools/r8/classmerging/vertical/B141942381.java
index 97f84ef..d840b52 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/B141942381.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/B141942381.java
@@ -77,8 +77,8 @@
     assertThat(set, isPresent());
 
     assertEquals(
-        set.getMethod().method.proto.parameters.values[0],
-        storage.getField().field.type.toBaseType(inspector.getFactory()));
+        set.getMethod().getReference().proto.parameters.values[0],
+        storage.getField().getReference().type.toBaseType(inspector.getFactory()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DumpCoreLibUsage.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DumpCoreLibUsage.java
index 62d2d3a..ae4eda0 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DumpCoreLibUsage.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DumpCoreLibUsage.java
@@ -85,13 +85,13 @@
         if (!field.accessFlags.isPublic()) {
           continue;
         }
-        if (filter.contains(field.field)) {
+        if (filter.contains(field.getReference())) {
           continue;
         }
-        if (usesTypeFromPackage(pkg, field.field)) {
+        if (usesTypeFromPackage(pkg, field.getReference())) {
           headerWritten = writeHeaderIfNeeded(libraryClass.type, headerWritten);
           System.out.println("  " + field.toSourceString());
-          found.add(field.field);
+          found.add(field.getReference());
         }
       }
 
@@ -105,13 +105,13 @@
         if (method.isSyntheticMethod()) {
           continue;
         }
-        if (filter.contains(method.method)) {
+        if (filter.contains(method.getReference())) {
           continue;
         }
-        if (usesTypeFromPackage(pkg, method.method)) {
+        if (usesTypeFromPackage(pkg, method.getReference())) {
           headerWritten = writeHeaderIfNeeded(libraryClass.type, headerWritten);
-          System.out.println("  " + method.method.toSourceStringWithoutHolder());
-          found.add(method.method);
+          System.out.println("  " + method.getReference().toSourceStringWithoutHolder());
+          found.add(method.getReference());
         }
       }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java
index e345069..32d9d95 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java
@@ -16,7 +16,6 @@
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.util.List;
 import java.util.function.Function;
-import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -51,7 +50,7 @@
         classSubject
             .uniqueMethodWithName("applyFunction")
             .getMethod()
-            .method
+            .getReference()
             .proto
             .parameters
             .values[0]
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java
index cb8c24f..e23e86d 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java
@@ -64,7 +64,7 @@
             .anyMatch(
                 m ->
                     m.getMethod()
-                        .method
+                        .getReference()
                         .proto
                         .parameters
                         .values[0]
@@ -75,7 +75,7 @@
             .anyMatch(
                 m ->
                     m.getMethod()
-                        .method
+                        .getReference()
                         .proto
                         .parameters
                         .values[0]
@@ -210,9 +210,9 @@
         virtualMethods.stream()
             .anyMatch(
                 m ->
-                    m.getMethod().method.name.toString().equals("foo")
+                    m.getMethod().getReference().name.toString().equals("foo")
                         && m.getMethod()
-                            .method
+                            .getReference()
                             .proto
                             .parameters
                             .values[0]
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 0ee446d..5cd8c8d 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
@@ -121,7 +121,7 @@
         IterableUtils.size(
             myCollection
                 .getDexProgramClass()
-                .virtualMethods(m -> m.method.name.toString().equals("forEach"))));
+                .virtualMethods(m -> m.getReference().name.toString().equals("forEach"))));
   }
 
   private void assertWrapperMethodsPresent(CodeInspector inspector) {
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MinimumNumberOfBridgesGenerated.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MinimumNumberOfBridgesGenerated.java
index b38e710..47320d8 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MinimumNumberOfBridgesGenerated.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MinimumNumberOfBridgesGenerated.java
@@ -86,16 +86,19 @@
   private boolean isNestBridge(FoundMethodSubject methodSubject) {
     DexEncodedMethod method = methodSubject.getMethod();
     if (method.isInstanceInitializer()) {
-      if (method.method.proto.parameters.isEmpty()) {
+      if (method.getReference().proto.parameters.isEmpty()) {
         return false;
       }
-      DexType[] formals = method.method.proto.parameters.values;
+      DexType[] formals = method.getReference().proto.parameters.values;
       DexType lastFormal = formals[formals.length - 1];
       return lastFormal.isClassType()
           && SyntheticItemsTestUtils.isInitializerTypeArgument(
               Reference.classFromDescriptor(lastFormal.toDescriptorString()));
     }
-    return method.method.name.toString()
+    return method
+        .getReference()
+        .name
+        .toString()
         .startsWith(NestBasedAccessDesugaring.NEST_ACCESS_NAME_PREFIX);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingClassStaticizerTest.java b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingClassStaticizerTest.java
index 1e5bd5b..750c6fe 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingClassStaticizerTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingClassStaticizerTest.java
@@ -76,7 +76,7 @@
     MethodSubject method =
         codeInspector.clazz(CompanionHost.class).uniqueMethodWithName(renamedMethodName);
     assertThat(method, isPresent());
-    assertEquals("int", method.getMethod().method.proto.parameters.toString());
+    assertEquals("int", method.getMethod().getReference().proto.parameters.toString());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
index b1d9990..06666db 100644
--- a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
@@ -227,7 +227,7 @@
     DexField aFieldOnInterface = factory
         .createField(factory.createType("LInterface;"), factory.intType, "aField");
 
-    assertEquals(aFieldOnInterface, appInfo.lookupStaticTarget(aFieldOnSubClass).field);
+    assertEquals(aFieldOnInterface, appInfo.lookupStaticTarget(aFieldOnSubClass).getReference());
 
     assertEquals("42", runArt(application));
 
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
index 51b5323..57078d1 100644
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
+++ b/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
@@ -70,12 +70,13 @@
 
   private void testVirtualLookup(DexProgramClass clazz, DexEncodedMethod method) {
     // Check lookup will produce the same result.
-    DexMethod id = method.method;
+    DexMethod id = method.getReference();
     assertEquals(
-        appInfo().resolveMethodOnClass(method.method, id.holder).getSingleTarget(), method);
+        appInfo().resolveMethodOnClass(method.getReference(), id.holder).getSingleTarget(), method);
 
     // Check lookup targets with include method.
-    ResolutionResult resolutionResult = appInfo().resolveMethodOnClass(method.method, clazz);
+    ResolutionResult resolutionResult =
+        appInfo().resolveMethodOnClass(method.getReference(), clazz);
     AppInfoWithLiveness appInfo = null; // TODO(b/154881041): Remove or compute liveness.
     LookupResult lookupResult =
         resolutionResult.lookupVirtualDispatchTargets(
@@ -96,7 +97,7 @@
     AppInfoWithLiveness appInfo = null; // TODO(b/154881041): Remove or compute liveness.
     LookupResultSuccess lookupResult =
         appInfo()
-            .resolveMethodOnInterface(clazz, method.method)
+            .resolveMethodOnInterface(clazz, method.getReference())
             .lookupVirtualDispatchTargets(clazz, appInfo(), appInfo, dexReference -> false)
             .asLookupResultSuccess();
     assertNotNull(lookupResult);
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessInfoTest.java b/src/test/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessInfoTest.java
index 024dd38..ec665d3 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessInfoTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessInfoTest.java
@@ -140,7 +140,7 @@
   private DexEncodedField uniqueFieldByName(DexProgramClass clazz, String name) {
     DexEncodedField result = null;
     for (DexEncodedField field : clazz.fields()) {
-      if (field.field.name.toSourceString().equals(name)) {
+      if (field.getReference().name.toSourceString().equals(name)) {
         assertNull(result);
         result = field;
       }
diff --git a/src/test/java/com/android/tools/r8/ir/conversion/PartialCallGraphTest.java b/src/test/java/com/android/tools/r8/ir/conversion/PartialCallGraphTest.java
index 009d4e3d..36acfe9 100644
--- a/src/test/java/com/android/tools/r8/ir/conversion/PartialCallGraphTest.java
+++ b/src/test/java/com/android/tools/r8/ir/conversion/PartialCallGraphTest.java
@@ -137,7 +137,7 @@
 
   private Node findNode(Iterable<Node> nodes, String name) {
     for (Node n : nodes) {
-      if (n.getMethod().method.name.toString().equals(name)) {
+      if (n.getMethod().getReference().name.toString().equals(name)) {
         return n;
       }
     }
@@ -147,7 +147,7 @@
   private ProgramMethod findMethod(String name) {
     for (DexProgramClass clazz : appView.appInfo().classes()) {
       for (DexEncodedMethod method : clazz.methods()) {
-        if (method.method.name.toString().equals(name)) {
+        if (method.getReference().name.toString().equals(name)) {
           return new ProgramMethod(clazz, method);
         }
       }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
index 7049089..aad2f6f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
@@ -276,7 +276,7 @@
     for (int i = 0; i < 3; ++i) {
       MethodSubject markerSubject = clazz.method("void", "marker" + i, Collections.emptyList());
       assertTrue(markerSubject.isPresent());
-      markers[i] = markerSubject.getMethod().method;
+      markers[i] = markerSubject.getMethod().getReference();
     }
 
     // Count invokes to callee between markers.
@@ -290,7 +290,7 @@
 
       DexMethod target = ((InvokeInstructionSubject) instruction).invokedMethod();
 
-      if (target == callee.getMethod().method) {
+      if (target == callee.getMethod().getReference()) {
         assertTrue(phase == 0 || phase == 1);
         ++counters[phase];
         continue;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/EnumCanonicalizationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/EnumCanonicalizationTest.java
index 589fa3f..709a44b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/EnumCanonicalizationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/EnumCanonicalizationTest.java
@@ -73,7 +73,7 @@
             .streamInstructions()
             .filter(InstructionSubject::isStaticGet)
             .map(InstructionSubject::getField)
-            .filter(enumFieldSubject.getField().field::equals)
+            .filter(enumFieldSubject.getField().getReference()::equals)
             .count());
     assertEquals(
         1,
@@ -81,7 +81,9 @@
             .streamInstructions()
             .filter(InstructionSubject::isStaticGet)
             .map(InstructionSubject::getField)
-            .filter(enumWithClassInitializationSideEffectsFieldSubject.getField().field::equals)
+            .filter(
+                enumWithClassInitializationSideEffectsFieldSubject.getField().getReference()
+                    ::equals)
             .count());
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/MemberValuePropagationWithClassInitializationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/MemberValuePropagationWithClassInitializationTest.java
index 50e52e2..fb3d7e4 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/MemberValuePropagationWithClassInitializationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/MemberValuePropagationWithClassInitializationTest.java
@@ -84,7 +84,7 @@
         mainMethodSubject
             .streamInstructions()
             .filter(InstructionSubject::isStaticGet)
-            .anyMatch(x -> x.getField() == clinitFieldSubject.getField().field));
+            .anyMatch(x -> x.getField() == clinitFieldSubject.getField().getReference()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalInstanceFieldLoadAfterStoreTest.java b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalInstanceFieldLoadAfterStoreTest.java
index 329e574..cad2c50 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalInstanceFieldLoadAfterStoreTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalInstanceFieldLoadAfterStoreTest.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ir.optimize.redundantfieldloadelimination.RedundantFinalStaticFieldLoadAfterStoreTest.A;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.FieldSubject;
@@ -80,7 +79,7 @@
         .streamInstructions()
         .filter(InstructionSubject::isInstanceGet)
         .map(InstructionSubject::getField)
-        .filter(fieldSubject.getField().field::equals)
+        .filter(fieldSubject.getField().getReference()::equals)
         .count();
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalStaticFieldLoadAfterStoreTest.java b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalStaticFieldLoadAfterStoreTest.java
index 2b910f5..701c43f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalStaticFieldLoadAfterStoreTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalStaticFieldLoadAfterStoreTest.java
@@ -77,7 +77,7 @@
         .streamInstructions()
         .filter(InstructionSubject::isStaticGet)
         .map(InstructionSubject::getField)
-        .filter(fieldSubject.getField().field::equals)
+        .filter(fieldSubject.getField().getReference()::equals)
         .count();
   }
 
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 6e91c38..d268888 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
@@ -345,7 +345,7 @@
     assertThat(clazz, isPresent());
     return Streams.stream(clazz.getDexProgramClass().methods())
         .filter(method -> !method.isStatic())
-        .map(method -> method.method.toSourceString())
+        .map(method -> method.getReference().toSourceString())
         .sorted()
         .collect(Collectors.toList());
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/ParameterRewritingTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/ParameterRewritingTest.java
index b254b43..0125189 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/ParameterRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/ParameterRewritingTest.java
@@ -64,7 +64,7 @@
     MethodSubject createStaticMethodSubject =
         factoryClassSubject.uniqueMethodWithName("createStatic");
     assertThat(createStaticMethodSubject, isPresent());
-    assertEquals(1, createStaticMethodSubject.getMethod().method.proto.parameters.size());
+    assertEquals(1, createStaticMethodSubject.getMethod().getReference().proto.parameters.size());
 
     for (int i = 1; i <= 3; ++i) {
       String createStaticWithUnusedMethodName = "createStaticWithUnused" + i;
@@ -72,7 +72,7 @@
           factoryClassSubject.uniqueMethodWithName(createStaticWithUnusedMethodName);
       assertThat(createStaticWithUnusedMethodSubject, isPresent());
 
-      DexMethod method = createStaticWithUnusedMethodSubject.getMethod().method;
+      DexMethod method = createStaticWithUnusedMethodSubject.getMethod().getReference();
       assertEquals(1, method.proto.parameters.size());
       assertEquals("java.lang.String", method.proto.parameters.toString());
     }
@@ -81,7 +81,7 @@
         factoryClassSubject.uniqueMethodWithName("createStaticWithUnused4");
     assertThat(createStaticWithUnusedMethodSubject, isPresent());
 
-    DexMethod method = createStaticWithUnusedMethodSubject.getMethod().method;
+    DexMethod method = createStaticWithUnusedMethodSubject.getMethod().getReference();
     assertEquals(3, method.proto.parameters.size());
     assertEquals(
         "java.lang.String java.lang.String java.lang.String", method.proto.parameters.toString());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/PrivateInstanceMethodCollisionTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/PrivateInstanceMethodCollisionTest.java
index 0de94c9..8dc29fb 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/PrivateInstanceMethodCollisionTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/PrivateInstanceMethodCollisionTest.java
@@ -81,7 +81,7 @@
       assertEquals(2, aClassSubject.allMethods(FoundMethodSubject::isVirtual).size());
       String name = null;
       for (FoundMethodSubject m : aClassSubject.allMethods(FoundMethodSubject::isVirtual)) {
-        assertEquals(1, m.getMethod().method.proto.parameters.size());
+        assertEquals(1, m.getMethod().getReference().proto.parameters.size());
         if (name == null) {
           name = m.getFinalName();
         } else {
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 c6dfe83..2e3904a 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
@@ -95,7 +95,7 @@
 
       // TODO(b/131735725): Should also remove arguments from the virtual methods.
       if (keepUninstantiatedArguments || methodSubject.getOriginalName().contains("Virtual")) {
-        assertEquals(3, methodSubject.getMethod().method.proto.parameters.size());
+        assertEquals(3, methodSubject.getMethod().getReference().proto.parameters.size());
         assertEquals(3, methodSubject.getMethod().parameterAnnotationsList.size());
 
         for (int i = 0; i < 3; ++i) {
@@ -115,7 +115,7 @@
           }
         }
       } else {
-        assertEquals(2, methodSubject.getMethod().method.proto.parameters.size());
+        assertEquals(2, methodSubject.getMethod().getReference().proto.parameters.size());
         assertEquals(2, methodSubject.getMethod().parameterAnnotationsList.size());
 
         for (int i = 0; i < 2; ++i) {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/VoidReturnTypeRewritingTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/VoidReturnTypeRewritingTest.java
index 0ac4efc..5e5345a 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/VoidReturnTypeRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/VoidReturnTypeRewritingTest.java
@@ -63,16 +63,16 @@
     MethodSubject createStaticMethodSubject =
         factoryClassSubject.uniqueMethodWithName("createStatic");
     assertThat(createStaticMethodSubject, isPresent());
-    assertTrue(createStaticMethodSubject.getMethod().method.proto.returnType.isVoidType());
+    assertTrue(createStaticMethodSubject.getMethod().getReference().proto.returnType.isVoidType());
     MethodSubject createVirtualMethodSubject =
         factoryClassSubject.uniqueMethodWithName("createVirtual");
     assertThat(createVirtualMethodSubject, isPresent());
-    assertTrue(createVirtualMethodSubject.getMethod().method.proto.returnType.isVoidType());
+    assertTrue(createVirtualMethodSubject.getMethod().getReference().proto.returnType.isVoidType());
 
     createVirtualMethodSubject =
         inspector.clazz(SubFactory.class).uniqueMethodWithName("createVirtual");
     assertThat(createVirtualMethodSubject, isPresent());
-    assertTrue(createVirtualMethodSubject.getMethod().method.proto.returnType.isVoidType());
+    assertTrue(createVirtualMethodSubject.getMethod().getReference().proto.returnType.isVoidType());
 
     ClassSubject subSubFactoryClassSubject = inspector.clazz(SubSubFactory.class);
     assertThat(subSubFactoryClassSubject.method("void", "createVirtual"), isPresent());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/CollisionWithLibraryMethodsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/CollisionWithLibraryMethodsTest.java
index 45d858d..14efc77 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/CollisionWithLibraryMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/CollisionWithLibraryMethodsTest.java
@@ -65,10 +65,10 @@
 
     if (minification) {
       assertEquals("a", methodSubject.getFinalName());
-      assertEquals(0, methodSubject.getMethod().method.proto.parameters.size());
+      assertEquals(0, methodSubject.getMethod().getReference().proto.parameters.size());
     } else {
       assertEquals("toString1", methodSubject.getFinalName());
-      assertEquals(0, methodSubject.getMethod().method.proto.parameters.size());
+      assertEquals(0, methodSubject.getMethod().getReference().proto.parameters.size());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/PrivateInstanceMethodCollisionTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/PrivateInstanceMethodCollisionTest.java
index 073c3b4..b7ddd9e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/PrivateInstanceMethodCollisionTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/PrivateInstanceMethodCollisionTest.java
@@ -79,7 +79,7 @@
       assertEquals(2, aClassSubject.allMethods(FoundMethodSubject::isVirtual).size());
       String name = null;
       for (FoundMethodSubject m : aClassSubject.allMethods(FoundMethodSubject::isVirtual)) {
-        assertEquals(1, m.getMethod().method.proto.parameters.size());
+        assertEquals(1, m.getMethod().getReference().proto.parameters.size());
         if (name == null) {
           name = m.getFinalName();
         } else {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedAndUninstantiatedTypesTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedAndUninstantiatedTypesTest.java
index af6296b..138f0a9 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedAndUninstantiatedTypesTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedAndUninstantiatedTypesTest.java
@@ -58,8 +58,8 @@
     List<FoundMethodSubject> methods = i.clazz(Main.class).allMethods();
     assertEquals(9, methods.size());
     for (FoundMethodSubject method : methods) {
-      if (!method.getMethod().method.name.toString().equals("main")) {
-        assertEquals(0, method.getMethod().method.getArity());
+      if (!method.getMethod().getReference().name.toString().equals("main")) {
+        assertEquals(0, method.getMethod().getReference().getArity());
       }
     }
   }
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 bd1b805..955c5d4 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
@@ -91,7 +91,7 @@
       assertThat(methodSubject, isPresent());
 
       if (keepUnusedArguments) {
-        assertEquals(3, methodSubject.getMethod().method.proto.parameters.size());
+        assertEquals(3, methodSubject.getMethod().getReference().proto.parameters.size());
         assertEquals(3, methodSubject.getMethod().parameterAnnotationsList.size());
 
         for (int i = 0; i < 3; ++i) {
@@ -109,7 +109,7 @@
           }
         }
       } else {
-        assertEquals(2, methodSubject.getMethod().method.proto.parameters.size());
+        assertEquals(2, methodSubject.getMethod().getReference().proto.parameters.size());
         assertEquals(2, methodSubject.getMethod().parameterAnnotationsList.size());
 
         for (int i = 0; i < 2; ++i) {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentRemovalWithOverridingTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentRemovalWithOverridingTest.java
index 7456d35..281db3e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentRemovalWithOverridingTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentRemovalWithOverridingTest.java
@@ -63,7 +63,8 @@
 
     MethodSubject methodSubject = classSubject.uniqueMethodWithName("greeting");
     assertThat(methodSubject, isPresent());
-    assertEquals("java.lang.String", methodSubject.getMethod().method.proto.parameters.toString());
+    assertEquals(
+        "java.lang.String", methodSubject.getMethod().getReference().proto.parameters.toString());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsCollisionTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsCollisionTest.java
index 2c7fe55..1137a01 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsCollisionTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsCollisionTest.java
@@ -85,7 +85,7 @@
     MethodSubject methodB1Subject =
         bClassSubject.allMethods().stream().filter(FoundMethodSubject::isStatic).findFirst().get();
     assertThat(methodB1Subject, isPresent());
-    assertEquals(0, methodB1Subject.getMethod().method.proto.parameters.size());
+    assertEquals(0, methodB1Subject.getMethod().getReference().proto.parameters.size());
 
     // TODO(b/129933280): Determine if we should use member pool collection for unused argument
     //  removal for private and static methods.
@@ -97,7 +97,7 @@
     MethodSubject methodB2Subject =
         bClassSubject.allMethods().stream().filter(FoundMethodSubject::isVirtual).findFirst().get();
     assertThat(methodB2Subject, isPresent());
-    assertEquals(0, methodB2Subject.getMethod().method.proto.parameters.size());
+    assertEquals(0, methodB2Subject.getMethod().getReference().proto.parameters.size());
 
     // Verify that the virtual method B.method2() does not collide with a method in A.
     assertNotEquals(methodB2Subject.getFinalName(), methodA1Subject.getFinalName());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsInstanceConstructorTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsInstanceConstructorTest.java
index ea67170..c890e97 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsInstanceConstructorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsInstanceConstructorTest.java
@@ -59,7 +59,7 @@
 
     MethodSubject methodSubject = classSubject.uniqueMethodWithName("<init>");
     assertThat(methodSubject, isPresent());
-    assertTrue(methodSubject.getMethod().method.proto.parameters.isEmpty());
+    assertTrue(methodSubject.getMethod().getReference().proto.parameters.isEmpty());
 
     assertThat(inspector.clazz(B.class), not(isPresent()));
     assertThat(inspector.clazz(C.class), not(isPresent()));
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java
index b76eaa0..872b5f0 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java
@@ -129,7 +129,7 @@
 
               MethodSubject method = main.uniqueMethodWithName(methodName);
               assertThat(method, isPresent());
-              int arity = method.getMethod().method.getArity();
+              int arity = method.getMethod().getReference().getArity();
               // One from the method's own argument, if any, and
               // Two from Array utils, `contains` and `indexOf`, if inlined with access relaxation.
               assertEquals(
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedArgumentsInLambdasTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedArgumentsInLambdasTest.java
index 4db441f..19458e2 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedArgumentsInLambdasTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedArgumentsInLambdasTest.java
@@ -52,7 +52,7 @@
 
                         MethodSubject invoke = classSubject.uniqueMethodWithName("invoke");
                         assertThat(invoke, isPresent());
-                        assertEquals(2, invoke.getMethod().method.proto.parameters.size());
+                        assertEquals(2, invoke.getMethod().getReference().proto.parameters.size());
                       }
                     }));
   }
@@ -68,7 +68,7 @@
                       if (classSubject.getOriginalDescriptor().contains("$js")) {
                         MethodSubject get = classSubject.uniqueMethodWithName("get");
                         assertThat(get, isPresent());
-                        assertEquals(3, get.getMethod().method.proto.parameters.size());
+                        assertEquals(3, get.getMethod().getReference().proto.parameters.size());
                       }
                     }));
   }
diff --git a/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java b/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java
index ff61668..5c48866 100644
--- a/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java
+++ b/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java
@@ -91,13 +91,13 @@
     assertNotNull(f2);
     // TODO(b/72858955): due to the potential reflective access, they should have different names
     //   by R8's improved reflective access detection or via keep rules.
-    assertEquals(overloadaggressively, f1.field.name == f2.field.name);
+    assertEquals(overloadaggressively, f1.getReference().name == f2.getReference().name);
     DexEncodedField f3 = a.field(B.class.getCanonicalName(), "f3").getField();
     assertNotNull(f3);
     // TODO(b/72858955): ditto
-    assertEquals(overloadaggressively, f1.field.name == f3.field.name);
+    assertEquals(overloadaggressively, f1.getReference().name == f3.getReference().name);
     // TODO(b/72858955): ditto
-    assertEquals(overloadaggressively, f2.field.name == f3.field.name);
+    assertEquals(overloadaggressively, f2.getReference().name == f3.getReference().name);
 
     String main = FieldUpdater.class.getCanonicalName();
     ProcessResult javaOutput = runOnJavaRaw(main, classes);
@@ -143,7 +143,7 @@
     assertNotNull(f3);
     // TODO(b/72858955): due to the potential reflective access, they should have different names
     //   by R8's improved reflective access detection or via keep rules.
-    assertEquals(overloadaggressively, f1.field.name == f3.field.name);
+    assertEquals(overloadaggressively, f1.getReference().name == f3.getReference().name);
 
     String main = FieldResolution.class.getCanonicalName();
     ProcessResult javaOutput = runOnJavaRaw(main, classes);
@@ -188,14 +188,14 @@
     DexEncodedMethod m2 =
         b.method("java.lang.Object", "getF2", ImmutableList.of()).getMethod();
     // TODO(b/72858955): due to the potential reflective access, they should have different names.
-    assertEquals(overloadaggressively, m1.method.name == m2.method.name);
+    assertEquals(overloadaggressively, m1.getReference().name == m2.getReference().name);
     DexEncodedMethod m3 =
         b.method("java.lang.String", "getF3", ImmutableList.of()).getMethod();
     assertNotNull(m3);
     // TODO(b/72858955): ditto
-    assertEquals(overloadaggressively, m1.method.name == m3.method.name);
+    assertEquals(overloadaggressively, m1.getReference().name == m3.getReference().name);
     // TODO(b/72858955): ditto
-    assertEquals(overloadaggressively, m2.method.name == m3.method.name);
+    assertEquals(overloadaggressively, m2.getReference().name == m3.getReference().name);
 
     String main = MethodResolution.class.getCanonicalName();
     ProcessResult javaOutput = runOnJavaRaw(main, classes);
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 0556439..33bef6d 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
@@ -232,7 +232,7 @@
     return Arrays.stream(method.getMethod().getCode().asDexCode().instructions)
         .filter(instruction -> instruction instanceof IgetObject)
         .map(instruction -> (IgetObject) instruction)
-        .filter(get -> get.getField() == field.getField().field)
+        .filter(get -> get.getField() == field.getField().getReference())
         .count();
   }
 
@@ -268,23 +268,33 @@
     MethodSubject msvOnB = classB.method("void", "msv", ImmutableList.of());
     assertThat(msvOnB, isPresent());
     // Field load of volatile fields are never eliminated.
-    assertEquals(5, countIget(mvOnA.getMethod().getCode().asDexCode(), vOnA.getField().field));
-    assertEquals(5, countSget(msvOnA.getMethod().getCode().asDexCode(), svOnA.getField().field));
-    assertEquals(5, countIget(mvOnB.getMethod().getCode().asDexCode(), vOnA.getField().field));
-    assertEquals(5, countSget(msvOnB.getMethod().getCode().asDexCode(), svOnA.getField().field));
+    assertEquals(
+        5, countIget(mvOnA.getMethod().getCode().asDexCode(), vOnA.getField().getReference()));
+    assertEquals(
+        5, countSget(msvOnA.getMethod().getCode().asDexCode(), svOnA.getField().getReference()));
+    assertEquals(
+        5, countIget(mvOnB.getMethod().getCode().asDexCode(), vOnA.getField().getReference()));
+    assertEquals(
+        5, countSget(msvOnB.getMethod().getCode().asDexCode(), svOnA.getField().getReference()));
     // For fields on the same class both separate compilation (D8) and whole program
     // compilation (R8) will eliminate field loads on non-volatile fields.
-    assertEquals(1, countIget(mfOnA.getMethod().getCode().asDexCode(), fOnA.getField().field));
-    assertEquals(1, countSget(msfOnA.getMethod().getCode().asDexCode(), sfOnA.getField().field));
     assertEquals(
-        2, countIget(mfWithMonitorOnA.getMethod().getCode().asDexCode(), fOnA.getField().field));
+        1, countIget(mfOnA.getMethod().getCode().asDexCode(), fOnA.getField().getReference()));
+    assertEquals(
+        1, countSget(msfOnA.getMethod().getCode().asDexCode(), sfOnA.getField().getReference()));
+    assertEquals(
+        2,
+        countIget(
+            mfWithMonitorOnA.getMethod().getCode().asDexCode(), fOnA.getField().getReference()));
 
     // For fields on other class both separate compilation (D8) and whole program
     // compilation (R8) will differ in the eliminated field loads of non-volatile fields.
-    assertEquals(mfOnBGets,
-        countIget(mfOnB.getMethod().getCode().asDexCode(), fOnA.getField().field));
-    assertEquals(msfOnBGets,
-        countSget(msfOnB.getMethod().getCode().asDexCode(), sfOnA.getField().field));
+    assertEquals(
+        mfOnBGets,
+        countIget(mfOnB.getMethod().getCode().asDexCode(), fOnA.getField().getReference()));
+    assertEquals(
+        msfOnBGets,
+        countSget(msfOnB.getMethod().getCode().asDexCode(), sfOnA.getField().getReference()));
   }
 
   @Test
@@ -320,12 +330,17 @@
 
 
     for (FieldSubject field : new FieldSubject[]{years, months, days}) {
-      assertEquals(1,
-          countIget(totalDays.getMethod().getCode().asDexCode(), field.getField().field));
-      assertEquals(2,
-          countIget(totalDaysTimes2.getMethod().getCode().asDexCode(), field.getField().field));
-      assertEquals(3,
-          countIget(totalDaysTimes3.getMethod().getCode().asDexCode(), field.getField().field));
+      assertEquals(
+          1,
+          countIget(totalDays.getMethod().getCode().asDexCode(), field.getField().getReference()));
+      assertEquals(
+          2,
+          countIget(
+              totalDaysTimes2.getMethod().getCode().asDexCode(), field.getField().getReference()));
+      assertEquals(
+          3,
+          countIget(
+              totalDaysTimes3.getMethod().getCode().asDexCode(), field.getField().getReference()));
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentInterfaceTest.java b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentInterfaceTest.java
index c92f813..edc4c42 100644
--- a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentInterfaceTest.java
@@ -132,7 +132,7 @@
     ResolutionResult resolutionResult =
         appInfo.resolveMethodOnInterface(methodOnBReference.holder, methodOnBReference);
     DexEncodedMethod resolved = resolutionResult.getSingleTarget();
-    assertEquals(methodOnBReference, resolved.method);
+    assertEquals(methodOnBReference, resolved.getReference());
     assertFalse(resolutionResult.isVirtualTarget());
     DexEncodedMethod singleVirtualTarget =
         appInfo.lookupSingleVirtualTarget(methodOnBReference, methodOnB, false);
@@ -144,7 +144,7 @@
     ResolutionResult resolutionResult =
         appInfo.resolveMethodOnInterface(methodOnBReference.holder, methodOnBReference);
     DexEncodedMethod resolved = resolutionResult.getSingleTarget();
-    assertEquals(methodOnBReference, resolved.method);
+    assertEquals(methodOnBReference, resolved.getReference());
     assertFalse(resolutionResult.isVirtualTarget());
   }
 
diff --git a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentTest.java b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentTest.java
index 2ffd43d..7843995 100644
--- a/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/VirtualOverrideOfStaticMethodWithVirtualParentTest.java
@@ -176,7 +176,7 @@
     DexProgramClass bClass = appInfo.definitionForProgramType(methodOnB.holder);
     ResolutionResult resolutionResult = appInfo.resolveMethodOnClass(methodOnB, methodOnB.holder);
     DexEncodedMethod resolved = resolutionResult.getSingleTarget();
-    assertEquals(methodOnA, resolved.method);
+    assertEquals(methodOnA, resolved.getReference());
     assertFalse(resolutionResult.isVirtualTarget());
     DexEncodedMethod singleVirtualTarget =
         appInfo.lookupSingleVirtualTarget(methodOnB, bClass.getProgramDefaultInitializer(), false);
@@ -187,7 +187,7 @@
   public void lookupVirtualTargets() {
     ResolutionResult resolutionResult = appInfo.resolveMethodOnClass(methodOnB, methodOnB.holder);
     DexEncodedMethod resolved = resolutionResult.getSingleTarget();
-    assertEquals(methodOnA, resolved.method);
+    assertEquals(methodOnA, resolved.getReference());
     assertFalse(resolutionResult.isVirtualTarget());
   }
 
diff --git a/src/test/java/com/android/tools/r8/resolution/singletarget/InstantiatedLowerBoundTest.java b/src/test/java/com/android/tools/r8/resolution/singletarget/InstantiatedLowerBoundTest.java
index c636ef9..e116329 100644
--- a/src/test/java/com/android/tools/r8/resolution/singletarget/InstantiatedLowerBoundTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/singletarget/InstantiatedLowerBoundTest.java
@@ -67,7 +67,7 @@
         appInfo.lookupSingleVirtualTarget(fooA, mainMethod, false, t -> false, typeA, latticeB);
     assertNotNull(singleTarget);
     DexMethod fooB = buildNullaryVoidMethod(B.class, "foo", appInfo.dexItemFactory());
-    assertEquals(fooB, singleTarget.method);
+    assertEquals(fooB, singleTarget.getReference());
   }
 
   @Test
@@ -94,7 +94,7 @@
         appInfo.lookupSingleVirtualTarget(fooA, mainMethod, false, t -> false, typeA, latticeB);
     assertNotNull(singleTarget);
     DexMethod fooB = buildNullaryVoidMethod(B.class, "foo", appInfo.dexItemFactory());
-    assertEquals(fooB, singleTarget.method);
+    assertEquals(fooB, singleTarget.getReference());
   }
 
   @Test
@@ -133,7 +133,7 @@
     lookupResult
         .asLookupResultSuccess()
         .forEach(
-            clazzAndMethod -> actual.add(clazzAndMethod.getDefinition().method),
+            clazzAndMethod -> actual.add(clazzAndMethod.getDefinition().getReference()),
             lambdaTarget -> {
               assert false;
             });
diff --git a/src/test/java/com/android/tools/r8/resolution/singletarget/SuccessAndInvalidLookupTest.java b/src/test/java/com/android/tools/r8/resolution/singletarget/SuccessAndInvalidLookupTest.java
index a4b183c..85bd2ca 100644
--- a/src/test/java/com/android/tools/r8/resolution/singletarget/SuccessAndInvalidLookupTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/singletarget/SuccessAndInvalidLookupTest.java
@@ -55,7 +55,7 @@
     DexEncodedMethod singleTarget =
         appInfo.lookupSingleVirtualTarget(fooA, mainMethod, false, t -> false, typeA, null);
     assertNotNull(singleTarget);
-    assertEquals(fooA, singleTarget.method);
+    assertEquals(fooA, singleTarget.getReference());
     DexEncodedMethod invalidSingleTarget =
         appInfo.lookupSingleVirtualTarget(fooA, mainMethod, true, t -> false, typeA, null);
     assertNull(invalidSingleTarget);
@@ -82,7 +82,7 @@
     DexEncodedMethod singleTarget =
         appInfo.lookupSingleVirtualTarget(fooI, mainMethod, true, t -> false, typeA, null);
     assertNotNull(singleTarget);
-    assertEquals(fooA, singleTarget.method);
+    assertEquals(fooA, singleTarget.getReference());
     DexEncodedMethod invalidSingleTarget =
         appInfo.lookupSingleVirtualTarget(fooI, mainMethod, false, t -> false, typeA, null);
     assertNull(invalidSingleTarget);
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 ddaf47f..aa2df28 100644
--- a/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java
@@ -99,9 +99,9 @@
     DexClass clazz = classSubject.getDexProgramClass();
     assertEquals(3, clazz.getMethodCollection().numberOfVirtualMethods());
     for (DexEncodedMethod encodedMethod : clazz.virtualMethods()) {
-      assertTrue(encodedMethod.method.name.toString().startsWith("foo"));
+      assertTrue(encodedMethod.getReference().name.toString().startsWith("foo"));
       MethodSubject methodSubject =
-          classSubject.method(MethodSignature.fromDexMethod(encodedMethod.method));
+          classSubject.method(MethodSignature.fromDexMethod(encodedMethod.getReference()));
       assertThat(methodSubject, isPresentAndNotRenamed());
     }
   }
@@ -135,9 +135,9 @@
     DexClass clazz = classSubject.getDexProgramClass();
     assertEquals(3, clazz.getMethodCollection().numberOfVirtualMethods());
     for (DexEncodedMethod encodedMethod : clazz.virtualMethods()) {
-      assertTrue(encodedMethod.method.name.toString().startsWith("foo"));
+      assertTrue(encodedMethod.getReference().name.toString().startsWith("foo"));
       MethodSubject methodSubject =
-          classSubject.method(MethodSignature.fromDexMethod(encodedMethod.method));
+          classSubject.method(MethodSignature.fromDexMethod(encodedMethod.getReference()));
       assertThat(methodSubject, isPresentAndNotRenamed());
     }
   }
@@ -155,9 +155,9 @@
     DexClass clazz = classSubject.getDexProgramClass();
     assertEquals(3, clazz.getMethodCollection().numberOfVirtualMethods());
     for (DexEncodedMethod encodedMethod : clazz.virtualMethods()) {
-      assertTrue(encodedMethod.method.name.toString().startsWith("foo"));
+      assertTrue(encodedMethod.getReference().name.toString().startsWith("foo"));
       MethodSubject methodSubject =
-          classSubject.method(MethodSignature.fromDexMethod(encodedMethod.method));
+          classSubject.method(MethodSignature.fromDexMethod(encodedMethod.getReference()));
       assertThat(methodSubject, isPresentAndNotRenamed());
     }
   }
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 3f27bc6..c3e53cf 100644
--- a/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java
@@ -254,7 +254,9 @@
                   .filter(InstructionSubject::isStaticGet)
                   .anyMatch(
                       instruction ->
-                          instruction.getField().equals(clinitFieldSubject.getField().field)));
+                          instruction
+                              .getField()
+                              .equals(clinitFieldSubject.getField().getReference())));
         });
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/LibraryMethodOverrideInInterfaceMarkingTest.java b/src/test/java/com/android/tools/r8/shaking/LibraryMethodOverrideInInterfaceMarkingTest.java
index 437cdd2..42268b2 100644
--- a/src/test/java/com/android/tools/r8/shaking/LibraryMethodOverrideInInterfaceMarkingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/LibraryMethodOverrideInInterfaceMarkingTest.java
@@ -58,7 +58,7 @@
       AppInfoWithLiveness appInfo, DexType type) {
     DexProgramClass clazz = appInfo.definitionFor(type).asProgramClass();
     DexEncodedMethod method =
-        clazz.lookupVirtualMethod(m -> m.method.name.toString().equals("isEmpty"));
+        clazz.lookupVirtualMethod(m -> m.getReference().name.toString().equals("isEmpty"));
     assertTrue(method.isLibraryMethodOverride().isTrue());
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/LibraryMethodOverrideInLambdaMarkingTest.java b/src/test/java/com/android/tools/r8/shaking/LibraryMethodOverrideInLambdaMarkingTest.java
index 331eb12..563a312 100644
--- a/src/test/java/com/android/tools/r8/shaking/LibraryMethodOverrideInLambdaMarkingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/LibraryMethodOverrideInLambdaMarkingTest.java
@@ -61,7 +61,7 @@
       AppInfoWithLiveness appInfo, DexType type) {
     DexProgramClass clazz = appInfo.definitionFor(type).asProgramClass();
     DexEncodedMethod method =
-        clazz.lookupVirtualMethod(m -> m.method.name.toString().equals("iterator"));
+        clazz.lookupVirtualMethod(m -> m.getReference().name.toString().equals("iterator"));
     // TODO(b/149976493): Mark library overrides from lambda instances.
     if (parameters.isCfRuntime()) {
       assertTrue(method.isLibraryMethodOverride().isFalse());
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 7111f51..34da969 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
@@ -74,13 +74,13 @@
   }
 
   private static void checkFieldInDictionary(FieldSubject field) {
-    if (!names.contains(field.getField().field.name.toSourceString())) {
+    if (!names.contains(field.getField().getReference().name.toSourceString())) {
       throw new AssertionError();
     }
   }
 
   private static void checkMethodInDictionary(MethodSubject method) {
-    String name = method.getMethod().method.name.toSourceString();
+    String name = method.getMethod().getReference().name.toSourceString();
     if (!names.contains(name) && !name.equals("<init>") && !name.equals("main")) {
       throw new AssertionError();
     }
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/applymapping/IfRuleWithApplyMappingTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/applymapping/IfRuleWithApplyMappingTest.java
index 311d6a6..e841ffc 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/applymapping/IfRuleWithApplyMappingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/applymapping/IfRuleWithApplyMappingTest.java
@@ -65,7 +65,8 @@
         inspector.clazz(IfRuleWithApplyMappingTestClass.class).uniqueMethodWithName("method");
     assertThat(methodSubject, isPresent());
     assertEquals(
-        A.class.getTypeName(), methodSubject.getMethod().method.proto.parameters.toSourceString());
+        A.class.getTypeName(),
+        methodSubject.getMethod().getReference().proto.parameters.toSourceString());
   }
 }
 
diff --git a/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java b/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
index e5a8027..b9a9dc8 100644
--- a/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
+++ b/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
@@ -55,10 +55,12 @@
       assertEquals(1, getNumberOfProgramClasses(processdApplication));
       CodeInspector inspector = new CodeInspector(processdApplication);
       ClassSubject clazz = inspector.clazz(DEFAULT_CLASS_NAME);
-      clazz.forAllMethods(method -> {
-        int index = Integer.parseInt(method.getMethod().method.name.toString().substring(1));
-        checkers.get(index).accept(method.getMethod(), values.get(index));
-      });
+      clazz.forAllMethods(
+          method -> {
+            int index =
+                Integer.parseInt(method.getMethod().getReference().name.toString().substring(1));
+            checkers.get(index).accept(method.getMethod(), values.get(index));
+          });
     }
   }
 
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 a7b67bf..9324b87 100644
--- a/src/test/java/com/android/tools/r8/smali/OutlineTest.java
+++ b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
@@ -870,7 +870,7 @@
     List<DexType> r = new ArrayList<>();
     for (DexEncodedMethod directMethod : outlineMethods) {
       if (directMethod.getCode().asDexCode().instructions[0] instanceof InvokeVirtual) {
-        r.add(directMethod.method.proto.returnType);
+        r.add(directMethod.getReference().proto.returnType);
       }
     }
     assertEquals(2, r.size());
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 3436b9a..9dcec97 100644
--- a/src/test/java/com/android/tools/r8/utils/AppComparator.java
+++ b/src/test/java/com/android/tools/r8/utils/AppComparator.java
@@ -60,10 +60,11 @@
     CodeInspector inspect2 = new CodeInspector(app2, Paths.get(MAP_2));
 
     // Define your own tester to pick methods to inspect.
-    Predicate<DexEncodedMethod> methodTester = encodedMethod -> {
-      return encodedMethod.method.name.toString().equals("run")
-          && encodedMethod.method.getArity() == 0;
-    };
+    Predicate<DexEncodedMethod> methodTester =
+        encodedMethod -> {
+          return encodedMethod.getReference().name.toString().equals("run")
+              && encodedMethod.getReference().getArity() == 0;
+        };
 
     inspect1.forAllClasses(clazz1 -> {
       clazz1.forAllMethods(method1 -> {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeMatchers.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeMatchers.java
index 7059ae1..2b57e91 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeMatchers.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeMatchers.java
@@ -19,7 +19,7 @@
     if (!targetSubject.isPresent()) {
       throw new IllegalArgumentException();
     }
-    DexField target = targetSubject.getField().field;
+    DexField target = targetSubject.getField().getReference();
     return new TypeSafeMatcher<MethodSubject>() {
       @Override
       protected boolean matchesSafely(MethodSubject subject) {
@@ -79,7 +79,7 @@
     if (!targetSubject.isPresent()) {
       throw new IllegalArgumentException();
     }
-    DexMethod target = targetSubject.getMethod().method;
+    DexMethod target = targetSubject.getMethod().getReference();
     return new TypeSafeMatcher<MethodSubject>() {
       @Override
       protected boolean matchesSafely(MethodSubject subject) {
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 ef44c64..aae1912 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
@@ -15,7 +15,7 @@
   public abstract DexEncodedField getField();
 
   public DexField getDexField() {
-    return getField().field;
+    return getField().getReference();
   }
 
   public abstract DexValue getStaticValue();
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 ed04f35..be358de 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
@@ -121,7 +121,7 @@
 
   private DexEncodedMethod findMethod(Iterable<DexEncodedMethod> methods, DexMethod dexMethod) {
     for (DexEncodedMethod method : methods) {
-      if (method.method.equals(dexMethod)) {
+      if (method.getReference().equals(dexMethod)) {
         return method;
       }
     }
@@ -320,7 +320,7 @@
 
   private DexEncodedField findField(List<DexEncodedField> fields, DexField dexField) {
     for (DexEncodedField field : fields) {
-      if (field.field.equals(dexField)) {
+      if (field.getReference().equals(dexField)) {
         return field;
       }
     }
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 b071916..023f412 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
@@ -43,7 +43,7 @@
   }
 
   public TypeSubject type() {
-    return new TypeSubject(codeInspector, dexField.field.type);
+    return new TypeSubject(codeInspector, dexField.getReference().type);
   }
 
   @Override
@@ -79,7 +79,7 @@
 
   @Override
   public FieldSignature getFinalSignature() {
-    return FieldSignature.fromDexField(dexField.field);
+    return FieldSignature.fromDexField(dexField.getReference());
   }
 
   @Override
@@ -123,7 +123,9 @@
 
   @Override
   public String getJvmFieldSignatureAsString() {
-    return dexField.field.name.toString() + ":" + dexField.field.type.toDescriptorString();
+    return dexField.getReference().name.toString()
+        + ":"
+        + dexField.getReference().type.toDescriptorString();
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
index a3f6892..0eb0de1 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -155,7 +155,7 @@
 
   @Override
   public MethodSignature getFinalSignature() {
-    return MethodSignature.fromDexMethod(dexMethod.method);
+    return MethodSignature.fromDexMethod(dexMethod.getReference());
   }
 
   @Override
@@ -273,7 +273,7 @@
     }
     Object2IntMap<InstructionSubject> lineNumberTable = new Object2IntOpenHashMap<>();
     DexDebugPositionState state =
-        new DexDebugPositionState(debugInfo.startLine, getMethod().method);
+        new DexDebugPositionState(debugInfo.startLine, getMethod().getReference());
     Iterator<DexDebugEvent> iterator = Arrays.asList(debugInfo.events).iterator();
     for (Instruction insn : code.instructions) {
       int offset = insn.getOffset();
@@ -337,7 +337,7 @@
   }
 
   public MethodReference asMethodReference() {
-    DexMethod method = dexMethod.method;
+    DexMethod method = dexMethod.getReference();
     return Reference.method(
         Reference.classFromDescriptor(method.holder.toDescriptorString()),
         method.name.toString(),
@@ -349,15 +349,15 @@
 
   @Override
   public String getJvmMethodSignatureAsString() {
-    return dexMethod.method.name.toString()
+    return dexMethod.getName().toString()
         + "("
         + StringUtils.join(
             "",
-            Arrays.stream(dexMethod.method.proto.parameters.values)
+            Arrays.stream(dexMethod.getParameters().values)
                 .map(DexType::toDescriptorString)
                 .collect(Collectors.toList()))
         + ")"
-        + dexMethod.method.proto.returnType.toDescriptorString();
+        + dexMethod.returnType().toDescriptorString();
   }
 
   @Override