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
