Use getters to access holder of DexEncodedField and DexEncodedMethod

Change-Id: I3ca6acdb6658e1d83619994a1ab69d4768f2e304
diff --git a/src/main/java/com/android/tools/r8/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
index a6d704b..bf55656 100644
--- a/src/main/java/com/android/tools/r8/GenerateLintFiles.java
+++ b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
@@ -132,7 +132,7 @@
     List<DexEncodedMethod> directMethods = new ArrayList<>();
     List<DexEncodedMethod> virtualMethods = new ArrayList<>();
     for (DexEncodedMethod method : methods) {
-      assert method.method.holder == clazz.type;
+      assert method.holder() == clazz.type;
       CfCode code = null;
       if (!method.accessFlags.isAbstract() /*&& !method.accessFlags.isNative()*/) {
         code = buildEmptyThrowingCfCode(method.method);
diff --git a/src/main/java/com/android/tools/r8/PrintUses.java b/src/main/java/com/android/tools/r8/PrintUses.java
index 4b310aa..51b6ed7 100644
--- a/src/main/java/com/android/tools/r8/PrintUses.java
+++ b/src/main/java/com/android/tools/r8/PrintUses.java
@@ -203,7 +203,7 @@
           isStatic
               ? appInfo.lookupStaticTarget(field.holder, field)
               : appInfo.lookupInstanceTarget(field.holder, field);
-      if (baseField != null && baseField.field.holder != field.holder) {
+      if (baseField != null && baseField.holder() != field.holder) {
         field = baseField.field;
       }
       addType(field.holder);
@@ -214,7 +214,7 @@
           noObfuscationTypes.add(field.holder);
         }
         if (baseField.accessFlags.isVisibilityDependingOnPackage()) {
-          keepPackageNames.add(baseField.field.holder.getPackageName());
+          keepPackageNames.add(baseField.holder().getPackageName());
         }
         typeFields.add(field);
       }
@@ -234,7 +234,7 @@
           noObfuscationTypes.add(method.holder);
         }
         if (encodedMethod.accessFlags.isVisibilityDependingOnPackage()) {
-          keepPackageNames.add(encodedMethod.method.holder.getPackageName());
+          keepPackageNames.add(encodedMethod.holder().getPackageName());
         }
         typeMethods.add(method);
       }
@@ -247,7 +247,7 @@
     private void registerMethod(DexEncodedMethod method) {
       DexEncodedMethod superTarget =
           appInfo
-              .resolveMethod(method.method.holder, method.method)
+              .resolveMethod(method.holder(), method.method)
               .lookupInvokeSpecialTarget(context, appInfo);
       if (superTarget != null) {
         addMethod(superTarget.method);
@@ -477,7 +477,7 @@
       if (encodedMethod.accessFlags.isStatic()) {
         append("<clinit>");
       } else {
-        String holderName = encodedMethod.method.holder.toSourceString();
+        String holderName = encodedMethod.holder().toSourceString();
         String constructorName = holderName.substring(holderName.lastIndexOf('.') + 1);
         append(constructorName);
       }
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 5b4d9f2..93973c3 100644
--- a/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java
+++ b/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java
@@ -238,8 +238,8 @@
         if (argumentIndex < 0) {
           argumentType =
               code.method.isInstanceInitializer()
-                  ? new ThisInstanceInfo(instruction.asArgument(), code.method.method.holder)
-                  : createInitializedType(code.method.method.holder);
+                  ? new ThisInstanceInfo(instruction.asArgument(), code.method.holder())
+                  : createInitializedType(code.method.holder());
         } else {
           argumentType =
               createInitializedType(code.method.method.proto.parameters.values[argumentIndex]);
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 a7c3ec0..bd4c6da 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -351,10 +351,10 @@
     String originalClassName;
     if (proguardMap != null) {
       signature = proguardMap.originalSignatureOf(method.method);
-      originalClassName = proguardMap.originalNameOf(method.method.holder);
+      originalClassName = proguardMap.originalNameOf(method.holder());
     } else {
       signature = MethodSignature.fromDexMethod(method.method);
-      originalClassName = method.method.holder.toSourceString();
+      originalClassName = method.holder().toSourceString();
     }
     codeToSignatureMap.put(code, originalClassName + signature);
   }
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 0c4267c..897763a 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -400,7 +400,7 @@
   @Override
   public void registerCodeReferences(DexEncodedMethod method, UseRegistry registry) {
     for (CfInstruction instruction : instructions) {
-      instruction.registerUse(registry, method.method.holder);
+      instruction.registerUse(registry, method.holder());
     }
     for (CfTryCatch tryCatch : tryCatchRanges) {
       for (DexType guard : tryCatch.guards) {
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 85810ed..9dd0398 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -332,7 +332,7 @@
   }
 
   private boolean verifyCorrectnessOfFieldHolder(DexEncodedField field) {
-    assert field.field.holder == type
+    assert field.holder() == type
         : "Expected field `"
             + field.field.toSourceString()
             + "` to have holder `"
@@ -435,8 +435,7 @@
   }
 
   private boolean isSignaturePolymorphicMethod(DexEncodedMethod method, DexItemFactory factory) {
-    assert method.method.holder == factory.methodHandleType
-        || method.method.holder == factory.varHandleType;
+    assert method.holder() == factory.methodHandleType || method.holder() == factory.varHandleType;
     return method.accessFlags.isVarargs()
         && method.accessFlags.isNative()
         && method.method.proto.parameters.size() == 1
diff --git a/src/main/java/com/android/tools/r8/graph/DexClassAndMethod.java b/src/main/java/com/android/tools/r8/graph/DexClassAndMethod.java
index 37f8853..6c05f12 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClassAndMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClassAndMethod.java
@@ -12,7 +12,7 @@
   private final DexEncodedMethod method;
 
   DexClassAndMethod(DexClass holder, DexEncodedMethod method) {
-    assert holder.type == method.method.holder;
+    assert holder.type == method.holder();
     this.holder = holder;
     this.method = 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 49611c6..e73c267 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
@@ -73,7 +73,7 @@
     int argumentRegister = code.registerSize - code.incomingRegisterSize;
     if (!method.accessFlags.isStatic()) {
       DexString name = factory.thisName;
-      DexType type = method.method.holder;
+      DexType type = method.holder();
       startArgument(argumentRegister, name, type);
       argumentRegister += ValueType.fromDexType(type).requiredRegisters();
     }
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 10427a3..44526ed 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
@@ -206,7 +206,7 @@
           && singleValue.asSingleFieldValue().getField() == field) {
         return null;
       }
-      if (singleValue.isMaterializableInContext(appView, code.method.method.holder)) {
+      if (singleValue.isMaterializableInContext(appView, code.method.holder())) {
         TypeElement type = TypeElement.fromDexType(field.type, maybeNull(), appView);
         return singleValue.createMaterializingInstruction(
             appView, code, TypeAndLocalInfoSupplier.create(type, local));
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 01b0e84..bb1ee15 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -450,7 +450,7 @@
       WhyAreYouNotInliningReporter whyAreYouNotInliningReporter) {
     checkIfObsolete();
     return isInliningCandidate(
-        container.method.holder, inliningReason, appInfo, whyAreYouNotInliningReporter);
+        container.holder(), inliningReason, appInfo, whyAreYouNotInliningReporter);
   }
 
   public boolean isInliningCandidate(
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignature.java b/src/main/java/com/android/tools/r8/graph/GenericSignature.java
index 049cb7a..91ba7b7 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignature.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignature.java
@@ -518,7 +518,7 @@
 
     public static FieldTypeSignature toFieldTypeSignature(
         DexEncodedField field, AppView<AppInfoWithLiveness> appView) {
-      DexClass currentClassContext = appView.definitionFor(field.field.holder);
+      DexClass currentClassContext = appView.definitionFor(field.holder());
       DexDefinitionSignature<?> signature =
           toGenericSignature(currentClassContext, field, appView);
       if (signature != null) {
@@ -530,7 +530,7 @@
 
     public static MethodTypeSignature toMethodTypeSignature(
         DexEncodedMethod method, AppView<AppInfoWithLiveness> appView) {
-      DexClass currentClassContext = appView.definitionFor(method.method.holder);
+      DexClass currentClassContext = appView.definitionFor(method.holder());
       DexDefinitionSignature<?> signature =
           toGenericSignature(currentClassContext, method, appView);
       if (signature != null) {
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 269b36b..6fecde6 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodCollection.java
@@ -228,7 +228,7 @@
   }
 
   private boolean verifyCorrectnessOfMethodHolder(DexEncodedMethod method) {
-    assert method.method.holder == holder.type
+    assert method.holder() == holder.type
         : "Expected method `"
             + method.method.toSourceString()
             + "` to have holder `"
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 e8cae8d..e123de4 100644
--- a/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
@@ -119,12 +119,12 @@
       assert initialResolutionHolder != null;
       assert resolvedHolder != null;
       assert resolvedMethod != null;
-      assert resolvedHolder.type == resolvedMethod.method.holder;
+      assert resolvedHolder.type == resolvedMethod.holder();
       this.resolvedHolder = resolvedHolder;
       this.resolvedMethod = resolvedMethod;
       this.initialResolutionHolder = initialResolutionHolder;
       assert !resolvedMethod.isPrivateMethod()
-          || initialResolutionHolder.type == resolvedMethod.method.holder;
+          || initialResolutionHolder.type == resolvedMethod.holder();
     }
 
     public DexClass getResolvedHolder() {
@@ -324,7 +324,7 @@
       // It appears as if this check is also in place for non-initializer methods too.
       // See NestInvokeSpecialMethodAccessWithIntermediateTest.
       if ((target.isInstanceInitializer() || target.isPrivateMethod())
-          && target.method.holder != symbolicReference.type) {
+          && target.holder() != symbolicReference.type) {
         return null;
       }
       // Runtime exceptions:
@@ -567,7 +567,7 @@
         }
         if (candidate == null || candidate == DexEncodedMethod.SENTINEL) {
           // We cannot find a target above the resolved method.
-          if (current.type == overrideTarget.method.holder) {
+          if (current.type == overrideTarget.holder()) {
             return null;
           }
           current = current.superType == null ? null : appInfo.definitionFor(current.superType);
@@ -646,7 +646,7 @@
       }
       // For package private methods, a valid override has to be inside the package.
       assert resolvedMethod.accessFlags.isPackagePrivate();
-      return resolvedMethod.method.holder.isSamePackage(candidate.method.holder);
+      return resolvedMethod.holder().isSamePackage(candidate.holder());
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java b/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java
index fdb4dc1..061cbcf 100644
--- a/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java
@@ -127,7 +127,7 @@
   }
 
   private boolean hasKotlincClinitAssertionCode(DexEncodedMethod method) {
-    if (method.method.holder == dexItemFactory.kotlin.kotlinAssertions) {
+    if (method.holder() == dexItemFactory.kotlin.kotlinAssertions) {
       CfCode code = method.getCode().asCfCode();
       for (int i = 1; i < code.instructions.size(); i++) {
         CfInstruction instruction = code.instructions.get(i - 1);
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/InitializedClassesInInstanceMethodsAnalysis.java b/src/main/java/com/android/tools/r8/graph/analysis/InitializedClassesInInstanceMethodsAnalysis.java
index f32143d..7ecd527 100644
--- a/src/main/java/com/android/tools/r8/graph/analysis/InitializedClassesInInstanceMethodsAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/analysis/InitializedClassesInInstanceMethodsAnalysis.java
@@ -74,7 +74,7 @@
 
     // Record that the enclosing class is guaranteed to be initialized at the allocation site.
     AppInfoWithSubtyping appInfo = appView.appInfo();
-    DexType guaranteedToBeInitialized = context.method.holder;
+    DexType guaranteedToBeInitialized = context.holder();
     DexType existingGuaranteedToBeInitialized =
         mapping.getOrDefault(key, guaranteedToBeInitialized);
     mapping.put(
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java
index 7167e72..94ee9cf 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java
@@ -97,7 +97,7 @@
   }
 
   public boolean isClassDefinitelyLoadedBeforeInstruction(DexType type, Instruction instruction) {
-    DexType context = code.method.method.holder;
+    DexType context = code.method.holder();
     BasicBlock block = instruction.getBlock();
 
     // Visit the instructions in `block` prior to `instruction`.
@@ -335,7 +335,7 @@
       if (!resolutionResult.isSingleResolution()) {
         return false;
       }
-      DexType holder = resolutionResult.getSingleTarget().method.holder;
+      DexType holder = resolutionResult.getSingleTarget().holder();
       return appView.isSubtype(holder, type).isTrue();
     }
 
@@ -394,7 +394,7 @@
       if (!resolutionResult.isSingleResolution()) {
         return false;
       }
-      DexType holder = resolutionResult.getSingleTarget().method.holder;
+      DexType holder = resolutionResult.getSingleTarget().holder();
       return appView.isSubtype(holder, type).isTrue();
     }
 
@@ -430,7 +430,7 @@
       if (!resolutionResult.isSingleResolution()) {
         return false;
       }
-      DexType holder = resolutionResult.getSingleTarget().method.holder;
+      DexType holder = resolutionResult.getSingleTarget().holder();
       return appView.isSubtype(holder, type).isTrue();
     }
 
@@ -505,11 +505,11 @@
         enqueue(clazz.type, visited, worklist);
       } else if (definition.isDexEncodedField()) {
         DexEncodedField field = definition.asDexEncodedField();
-        enqueue(field.field.holder, visited, worklist);
+        enqueue(field.holder(), visited, worklist);
       } else if (definition.isDexEncodedMethod()) {
         assert instruction.isInvokeMethod();
         DexEncodedMethod method = definition.asDexEncodedMethod();
-        enqueue(method.method.holder, visited, worklist);
+        enqueue(method.holder(), visited, worklist);
         enqueueInitializedClassesOnNormalExit(method, instruction.inValues(), visited, worklist);
       } else {
         assert false;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/DeterminismAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/DeterminismAnalysis.java
index 0fc8bd0..9ae6c86 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/DeterminismAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/DeterminismAnalysis.java
@@ -37,7 +37,7 @@
       }
       if (instr.isInvokeMethod()) {
         DexEncodedMethod target =
-            instr.asInvokeMethod().lookupSingleTarget(appView, code.method.method.holder);
+            instr.asInvokeMethod().lookupSingleTarget(appView, code.method.holder());
         if (target != null && target.getOptimizationInfo().returnValueOnlyDependsOnArguments()) {
           continue;
         }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/InitializedClassesOnNormalExitAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/InitializedClassesOnNormalExitAnalysis.java
index f5cd48d..406c9e6 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/InitializedClassesOnNormalExitAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/InitializedClassesOnNormalExitAnalysis.java
@@ -36,7 +36,7 @@
   public static Set<DexType> computeInitializedClassesOnNormalExit(
       AppView<AppInfoWithLiveness> appView, IRCode code) {
     DominatorTree dominatorTree = new DominatorTree(code, Assumption.MAY_HAVE_UNREACHABLE_BLOCKS);
-    Visitor visitor = new Visitor(appView, code.method.method.holder);
+    Visitor visitor = new Visitor(appView, code.method.holder());
     for (BasicBlock dominator : dominatorTree.normalExitDominatorBlocks()) {
       if (dominator.hasCatchHandlers()) {
         // When determining which classes that are guaranteed to be initialized from a given
@@ -115,8 +115,8 @@
     public Void handleFieldInstruction(FieldInstruction instruction) {
       DexEncodedField field = appView.appInfo().resolveField(instruction.getField());
       if (field != null) {
-        if (field.field.holder.isClassType()) {
-          markInitializedOnNormalExit(field.field.holder);
+        if (field.holder().isClassType()) {
+          markInitializedOnNormalExit(field.holder());
         } else {
           assert false : "Expected holder of field type to be a class type";
         }
@@ -132,7 +132,7 @@
         if (method.holder.isClassType()) {
           DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, context);
           if (singleTarget != null) {
-            markInitializedOnNormalExit(singleTarget.method.holder);
+            markInitializedOnNormalExit(singleTarget.holder());
             markInitializedOnNormalExit(
                 singleTarget.getOptimizationInfo().getInitializedClassesOnNormalExit());
           } else {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/ValueMayDependOnEnvironmentAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/ValueMayDependOnEnvironmentAnalysis.java
index 9fcee4a..05416df 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/ValueMayDependOnEnvironmentAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/ValueMayDependOnEnvironmentAnalysis.java
@@ -84,7 +84,7 @@
   public ValueMayDependOnEnvironmentAnalysis(AppView<?> appView, IRCode code) {
     this.appView = appView;
     this.code = code;
-    this.context = code.method.method.holder;
+    this.context = code.method.holder();
   }
 
   public boolean valueMayDependOnEnvironment(Value value) {
@@ -433,7 +433,7 @@
       if (definition.isStaticGet()) {
         StaticGet staticGet = definition.asStaticGet();
         DexEncodedField field = appView.appInfo().resolveField(staticGet.getField());
-        if (field != null && field.field.holder == context) {
+        if (field != null && field.holder() == context) {
           List<StaticPut> finalFieldPuts = computeFinalFieldPuts().get(field);
           if (finalFieldPuts == null || finalFieldPuts.size() != 1) {
             return false;
@@ -452,7 +452,7 @@
       finalFieldPuts = new IdentityHashMap<>();
       for (StaticPut staticPut : code.<StaticPut>instructions(Instruction::isStaticPut)) {
         DexEncodedField field = appView.appInfo().resolveField(staticPut.getField());
-        if (field != null && field.field.holder == context && field.isFinal()) {
+        if (field != null && field.holder() == context && field.isFinal()) {
           finalFieldPuts.computeIfAbsent(field, ignore -> new ArrayList<>()).add(staticPut);
         }
       }
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 d5bd10a..75d5423 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
@@ -148,7 +148,7 @@
       return;
     }
 
-    DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, context.method.holder);
+    DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, context.holder());
     if (singleTarget == null) {
       // We just lost track.
       abstractInstanceFieldValues.remove(clazz);
@@ -173,7 +173,7 @@
               initializationInfo.asArgumentInitializationInfo();
           Value argument = invoke.arguments().get(argumentInitializationInfo.getArgumentIndex());
           AbstractValue abstractValue =
-              entry.getValue().join(argument.getAbstractValue(appView, context.method.holder));
+              entry.getValue().join(argument.getAbstractValue(appView, context.holder()));
           assert !abstractValue.isBottom();
           if (!abstractValue.isUnknown()) {
             entry.setValue(abstractValue);
@@ -294,7 +294,7 @@
     if (abstractValue.isUnknown()) {
       return true;
     }
-    assert abstractValue == value.getAbstractValue(appView, context.method.holder);
+    assert abstractValue == value.getAbstractValue(appView, context.holder());
     return true;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/FieldValueAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/FieldValueAnalysis.java
index af990b1..08989c0 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/FieldValueAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/FieldValueAnalysis.java
@@ -49,7 +49,7 @@
       DexProgramClass clazz,
       DexEncodedMethod method) {
     assert clazz != null;
-    assert clazz.type == method.method.holder;
+    assert clazz.type == method.holder();
     this.appView = appView;
     this.clazz = clazz;
     this.code = code;
@@ -129,7 +129,7 @@
 
     // Then check if any of the instructions that precede the given instruction in the current block
     // may read the field.
-    DexType context = method.method.holder;
+    DexType context = method.holder();
     InstructionIterator instructionIterator = block.iterator();
     while (instructionIterator.hasNext()) {
       Instruction current = instructionIterator.next();
@@ -164,7 +164,7 @@
    * and its transitive predecessors.
    */
   private Map<BasicBlock, AbstractFieldSet> createFieldsMaybeReadBeforeBlockInclusive() {
-    DexType context = method.method.holder;
+    DexType context = method.holder();
     Map<BasicBlock, AbstractFieldSet> result = new IdentityHashMap<>();
     Deque<BasicBlock> worklist = DequeUtils.newArrayDeque(code.entryBlock());
     while (!worklist.isEmpty()) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java
index 3aec803..58b4194 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java
@@ -86,7 +86,7 @@
     assert appView.enableWholeProgramOptimizations();
     assert method.isInstanceInitializer();
 
-    DexProgramClass clazz = appView.definitionFor(method.method.holder).asProgramClass();
+    DexProgramClass clazz = appView.definitionFor(method.holder()).asProgramClass();
     if (!appView.options().enableValuePropagationForInstanceFields) {
       return EmptyInstanceFieldInitializationInfoCollection.getInstance();
     }
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 4d57a5e..e2ab677 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
@@ -53,7 +53,7 @@
     assert appView.enableWholeProgramOptimizations();
     assert method.isClassInitializer();
     timing.begin("Analyze class initializer");
-    DexProgramClass clazz = appView.definitionFor(method.method.holder).asProgramClass();
+    DexProgramClass clazz = appView.definitionFor(method.holder()).asProgramClass();
     new StaticFieldValueAnalysis(appView.withLiveness(), code, feedback, clazz, method)
         .computeFieldOptimizationInfo(classInitializerDefaultsResult);
     timing.end();
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 2a70440..08b29ce 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
@@ -130,7 +130,7 @@
    */
   public void rewriteCode(DexEncodedMethod method, IRCode code) {
     if (method.isClassInitializer()
-        && classesWithRemovedExtensionFields.contains(method.method.holder)
+        && classesWithRemovedExtensionFields.contains(method.holder())
         && code.metadata().mayHaveStaticPut()) {
       rewriteClassInitializer(code);
     }
@@ -204,7 +204,7 @@
       return false;
     }
 
-    DexClass clazz = appView.definitionFor(encodedField.field.holder);
+    DexClass clazz = appView.definitionFor(encodedField.holder());
     if (clazz == null || !clazz.isProgramClass()) {
       return false;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
index 390f2b2..b2d813a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
@@ -99,7 +99,7 @@
    * newMessageInfo is still pending.
    */
   private void rewriteDynamicMethod(DexEncodedMethod method, IRCode code) {
-    DexClass context = appView.definitionFor(method.method.holder);
+    DexClass context = appView.definitionFor(method.holder());
     if (context == null || !context.isProgramClass()) {
       return;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java
index de37f38..1321984 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoInliningReasonStrategy.java
@@ -36,7 +36,7 @@
   @Override
   public Reason computeInliningReason(
       InvokeMethod invoke, DexEncodedMethod target, DexEncodedMethod context) {
-    DexProgramClass enclosingClass = appView.definitionFor(context.method.holder).asProgramClass();
+    DexProgramClass enclosingClass = appView.definitionFor(context.holder()).asProgramClass();
     if (references.isAbstractGeneratedMessageLiteBuilder(enclosingClass)
         && invoke.isInvokeSuper()) {
       // Aggressively inline invoke-super calls inside the GeneratedMessageLite builders. Such
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
index e414f23..d6d2990 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
@@ -135,7 +135,7 @@
       return;
     }
 
-    DexType holder = encodedMethod.method.holder;
+    DexType holder = encodedMethod.holder();
     if (seenButNotLiveProtos.containsKey(holder)) {
       // The proto is now live instead of dead.
       liveProtos.put(holder, seenButNotLiveProtos.remove(holder));
@@ -150,7 +150,7 @@
 
   private void createProtoMessageInfoFromDynamicMethod(
       DexEncodedMethod dynamicMethod, Map<DexType, ProtoMessageInfo> protos) {
-    DexType holder = dynamicMethod.method.holder;
+    DexType holder = dynamicMethod.holder();
     assert !protos.containsKey(holder);
 
     DexClass context = appView.definitionFor(holder);
@@ -254,7 +254,7 @@
     for (DexEncodedMethod findLiteExtensionByNumberMethod : findLiteExtensionByNumberMethods) {
       IRCode code =
           findLiteExtensionByNumberMethod.buildIR(
-              appView, appView.appInfo().originFor(findLiteExtensionByNumberMethod.method.holder));
+              appView, appView.appInfo().originFor(findLiteExtensionByNumberMethod.holder()));
       for (BasicBlock block : code.blocks(BasicBlock::isReturnBlock)) {
         Value returnValue = block.exit().asReturn().returnValue().getAliasedValue();
         if (returnValue.isPhi()) {
@@ -275,7 +275,7 @@
             continue;
           }
 
-          DexProgramClass holder = asProgramClassOrNull(appView.definitionFor(field.field.holder));
+          DexProgramClass holder = asProgramClassOrNull(appView.definitionFor(field.holder()));
           if (holder == null) {
             assert false;
             continue;
@@ -365,7 +365,7 @@
       }
 
       DexEncodedMethod dynamicMethod = protoMessageInfo.getDynamicMethod();
-      DexProgramClass clazz = appView.definitionFor(dynamicMethod.method.holder).asProgramClass();
+      DexProgramClass clazz = appView.definitionFor(dynamicMethod.holder()).asProgramClass();
 
       for (ProtoFieldInfo protoFieldInfo : protoMessageInfo.getFields()) {
         DexEncodedField valueStorage = protoFieldInfo.getValueStorage(appView, protoMessageInfo);
@@ -526,7 +526,7 @@
       return;
     }
 
-    DexClass clazz = appView.definitionFor(encodedOneOfCaseField.field.holder);
+    DexClass clazz = appView.definitionFor(encodedOneOfCaseField.holder());
     if (clazz == null || !clazz.isProgramClass()) {
       assert false;
       return;
@@ -555,7 +555,7 @@
       return;
     }
 
-    if (encodedOneOfField.field.holder != encodedOneOfCaseField.field.holder) {
+    if (encodedOneOfField.holder() != encodedOneOfCaseField.holder()) {
       assert false;
       return;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoMessageInfo.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoMessageInfo.java
index ac88305..f026295 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoMessageInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoMessageInfo.java
@@ -220,7 +220,7 @@
   }
 
   public DexType getType() {
-    return dynamicMethod.method.holder;
+    return dynamicMethod.holder();
   }
 
   public boolean hasFields() {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/sideeffect/ClassInitializerSideEffectAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/sideeffect/ClassInitializerSideEffectAnalysis.java
index 3449c30..0d500e9 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/sideeffect/ClassInitializerSideEffectAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/sideeffect/ClassInitializerSideEffectAnalysis.java
@@ -39,7 +39,7 @@
    */
   public static ClassInitializerSideEffect classInitializerCanBePostponed(
       AppView<?> appView, IRCode code) {
-    DexType context = code.method.method.holder;
+    DexType context = code.method.holder();
     OptionalBool controlFlowMayDependOnEnvironment = OptionalBool.unknown();
     boolean mayHaveSideEffects = false;
 
@@ -113,7 +113,7 @@
         StaticPut staticPut = instruction.asStaticPut();
         DexEncodedField field = appView.appInfo().resolveField(staticPut.getField());
         if (field == null
-            || field.field.holder != context
+            || field.holder() != context
             || environmentAnalysis.valueMayDependOnEnvironment(staticPut.value())
             || instruction.instructionInstanceCanThrow(appView, context).isThrowing()) {
           return ClassInitializerSideEffect.SIDE_EFFECTS_THAT_CANNOT_BE_POSTPONED;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
index 34a83d1..3f5640d 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
@@ -72,7 +72,7 @@
     Value returnedValue =
         code.createValue(classClassType(appView, definitelyNotNull()), debugLocalInfo);
     ConstClass instruction = new ConstClass(returnedValue, type);
-    assert !instruction.instructionMayHaveSideEffects(appView, code.method.method.holder);
+    assert !instruction.instructionMayHaveSideEffects(appView, code.method.holder());
     return instruction;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
index ef38879..855694a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
@@ -85,7 +85,7 @@
   public boolean isMaterializableInContext(AppView<?> appView, DexType context) {
     DexEncodedField encodedField = appView.appInfo().resolveField(field);
     return isMemberVisibleFromOriginalContext(
-        appView, context, encodedField.field.holder, encodedField.accessFlags);
+        appView, context, encodedField.holder(), encodedField.accessFlags);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java b/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
index dc0b133..0994dc0 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
@@ -90,7 +90,7 @@
 
   @Override
   public boolean canBeDeadCode(AppView<?> appView, IRCode code) {
-    return !instructionMayHaveSideEffects(appView, code.method.method.holder);
+    return !instructionMayHaveSideEffects(appView, code.method.holder());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
index f4a8a14..cd29ec9 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
@@ -192,7 +192,7 @@
 
   @Override
   public boolean canBeDeadCode(AppView<?> appView, IRCode code) {
-    return !instructionMayHaveSideEffects(appView, code.method.method.holder);
+    return !instructionMayHaveSideEffects(appView, code.method.holder());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
index 4e5c923..65a8acc 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
@@ -495,8 +495,8 @@
       Set<BasicBlock> blocksToRemove,
       DexType downcast) {
     assert blocksToRemove != null;
-    DexType codeHolder = code.method.method.holder;
-    DexType inlineeHolder = inlinee.method.method.holder;
+    DexType codeHolder = code.method.holder();
+    DexType inlineeHolder = inlinee.method.holder();
     if (codeHolder != inlineeHolder && inlinee.method.isOnlyInlinedIntoNestMembers()) {
       // Should rewrite private calls to virtual calls.
       assert NestUtils.sameNest(codeHolder, inlineeHolder, appView);
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
index e77f315..a97ce72 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
@@ -142,7 +142,7 @@
 
   @Override
   public boolean canBeDeadCode(AppView<?> appView, IRCode code) {
-    return !instructionMayHaveSideEffects(appView, code.method.method.holder);
+    return !instructionMayHaveSideEffects(appView, code.method.holder());
   }
 
   @Override
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 d7e0067..18f8326 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
@@ -232,7 +232,7 @@
     assert isFieldGet();
     DexEncodedField field = appView.appInfo().resolveField(getField());
     if (field != null) {
-      DexClass holder = appView.definitionFor(field.field.holder);
+      DexClass holder = appView.definitionFor(field.holder());
       if (holder != null && holder.isLibraryClass() && field.isStatic() && field.isFinal()) {
         return appView.abstractValueFactory().createSingleFieldValue(field.field);
       }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
index 6edc6da..0740db4 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
@@ -127,7 +127,7 @@
     // * IncompatibleClassChangeError (instance-* instruction for static fields)
     // * IllegalAccessError (not visible from the access context)
     // * NullPointerException (null receiver)
-    return !instructionMayHaveSideEffects(appView, code.method.method.holder);
+    return !instructionMayHaveSideEffects(appView, code.method.holder());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
index 116a3e6..58bcd28 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
@@ -142,7 +142,7 @@
     // * IllegalAccessError (not visible from the access context)
     // * NullPointerException (null receiver)
     // * not read at all
-    boolean haveSideEffects = instructionMayHaveSideEffects(appView, code.method.method.holder);
+    boolean haveSideEffects = instructionMayHaveSideEffects(appView, code.method.holder());
     assert appView.enableWholeProgramOptimizations() || haveSideEffects
         : "Expected instance-put instruction to have side effects in D8";
     return !haveSideEffects;
diff --git a/src/main/java/com/android/tools/r8/ir/code/Instruction.java b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
index 654c2e8..b280728 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Instruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
@@ -593,7 +593,7 @@
   /** Returns true is this instruction can be treated as dead code if its outputs are not used. */
   public boolean canBeDeadCode(AppView<?> appView, IRCode code) {
     // TODO(b/129530569): instructions with fine-grained side effect analysis may use:
-    // return !instructionMayHaveSideEffects(appView, code.method.method.holder);
+    // return !instructionMayHaveSideEffects(appView, code.method.holder());
     return !instructionInstanceCanThrow();
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java b/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
index ddc8952..d6aaf36 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
@@ -190,12 +190,12 @@
 
     // Verify that the target method is accessible in the current context.
     if (!isMemberVisibleFromOriginalContext(
-        appView, context, target.method.holder, target.accessFlags)) {
+        appView, context, target.holder(), target.accessFlags)) {
       return true;
     }
 
     // Verify that the target method does not have side-effects.
-    DexClass clazz = appView.definitionFor(target.method.holder);
+    DexClass clazz = appView.definitionFor(target.holder());
     if (clazz == null) {
       assert false : "Expected to be able to find the enclosing class of a method definition";
       return true;
@@ -218,7 +218,7 @@
   @Override
   public boolean canBeDeadCode(AppView<?> appView, IRCode code) {
     DexEncodedMethod method = code.method;
-    if (instructionMayHaveSideEffects(appView, method.method.holder)) {
+    if (instructionMayHaveSideEffects(appView, method.holder())) {
       return false;
     }
 
@@ -236,7 +236,7 @@
           if (appView.dexItemFactory().isConstructor(invoke.getInvokedMethod())
               && invoke.getReceiver() == getReceiver()) {
             // If another constructor call than `this` is found, then it must not have side effects.
-            if (invoke.instructionMayHaveSideEffects(appView, method.method.holder)) {
+            if (invoke.instructionMayHaveSideEffects(appView, method.holder())) {
               return false;
             }
             if (otherInitCalls == null) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
index 9b708bc..63f6a89 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMethod.java
@@ -118,9 +118,7 @@
             methodTarget -> {
               DexEncodedMethod target = methodTarget.getMethod();
               if (target == refinedTarget
-                  || appView
-                      .isSubtype(target.method.holder, refinedReceiverType)
-                      .isPossiblyTrue()) {
+                  || appView.isSubtype(target.holder(), refinedReceiverType).isPossiblyTrue()) {
                 result.add(target);
               }
             },
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
index a71d185..41fac8c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
@@ -184,7 +184,7 @@
 
   @Override
   public boolean canBeDeadCode(AppView<?> appView, IRCode code) {
-    return !instructionMayHaveSideEffects(appView, code.method.method.holder);
+    return !instructionMayHaveSideEffects(appView, code.method.holder());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
index 7992a1c..b285dd6 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
@@ -197,7 +197,7 @@
 
   @Override
   public boolean canBeDeadCode(AppView<?> appView, IRCode code) {
-    return !instructionMayHaveSideEffects(appView, code.method.method.holder);
+    return !instructionMayHaveSideEffects(appView, code.method.holder());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
index 2d29972..01a6a76 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
@@ -183,7 +183,7 @@
 
       // Verify that the target method is accessible in the current context.
       if (!isMemberVisibleFromOriginalContext(
-          appView, context, target.method.holder, target.accessFlags)) {
+          appView, context, target.holder(), target.accessFlags)) {
         return true;
       }
 
@@ -200,12 +200,14 @@
         return false;
       }
 
-      return target.method.holder.classInitializationMayHaveSideEffects(
-          appView,
-          // Types that are a super type of `context` are guaranteed to be initialized
-          // already.
-          type -> appView.isSubtype(context, type).isTrue(),
-          Sets.newIdentityHashSet());
+      return target
+          .holder()
+          .classInitializationMayHaveSideEffects(
+              appView,
+              // Types that are a super type of `context` are guaranteed to be initialized
+              // already.
+              type -> appView.isSubtype(context, type).isTrue(),
+              Sets.newIdentityHashSet());
     }
 
     return true;
@@ -213,6 +215,6 @@
 
   @Override
   public boolean canBeDeadCode(AppView<?> appView, IRCode code) {
-    return !instructionMayHaveSideEffects(appView, code.method.method.holder);
+    return !instructionMayHaveSideEffects(appView, code.method.holder());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
index 711c911..c30a8cb 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
@@ -180,7 +180,7 @@
 
       // Verify that the target method is accessible in the current context.
       if (!isMemberVisibleFromOriginalContext(
-          appView, context, target.method.holder, target.accessFlags)) {
+          appView, context, target.holder(), target.accessFlags)) {
         return true;
       }
 
@@ -200,6 +200,6 @@
 
   @Override
   public boolean canBeDeadCode(AppView<?> appView, IRCode code) {
-    return !instructionMayHaveSideEffects(appView, code.method.method.holder);
+    return !instructionMayHaveSideEffects(appView, code.method.holder());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java b/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java
index 2211a59..87643df 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java
@@ -151,6 +151,6 @@
 
   @Override
   public boolean canBeDeadCode(AppView<?> appView, IRCode code) {
-    return !instructionMayHaveSideEffects(appView, code.method.method.holder);
+    return !instructionMayHaveSideEffects(appView, code.method.holder());
   }
 }
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 d8acd0b..b59a2c2 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
@@ -196,7 +196,7 @@
 
   @Override
   public boolean canBeDeadCode(AppView<?> appView, IRCode code) {
-    return !instructionMayHaveSideEffects(appView, code.method.method.holder);
+    return !instructionMayHaveSideEffects(appView, code.method.holder());
   }
 
   public void markNoSpilling() {
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
index 2c246f92..2b705fa 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
@@ -156,7 +156,7 @@
     // * IncompatibleClassChangeError (static-* instruction for instance fields)
     // * IllegalAccessError (not visible from the access context)
     // * side-effects in <clinit>
-    return !instructionMayHaveSideEffects(appView, code.method.method.holder);
+    return !instructionMayHaveSideEffects(appView, code.method.holder());
   }
 
   @Override
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 16c102b..7249d94 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
@@ -139,7 +139,7 @@
     // * IllegalAccessError (not visible from the access context)
     // * side-effects in <clinit>
     // * not read _globally_
-    boolean haveSideEffects = instructionMayHaveSideEffects(appView, code.method.method.holder);
+    boolean haveSideEffects = instructionMayHaveSideEffects(appView, code.method.holder());
     assert appView.enableWholeProgramOptimizations() || haveSideEffects
         : "Expected static-put instruction to have side effects in D8";
     return !haveSideEffects;
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 6ff7e2f..18b62e6 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
@@ -178,7 +178,7 @@
         if (singleTarget != null) {
           assert !source.accessFlags.isBridge() || singleTarget != currentMethod.method;
           DexProgramClass clazz =
-              asProgramClassOrNull(appView.definitionFor(singleTarget.method.holder));
+              asProgramClassOrNull(appView.definitionFor(singleTarget.holder()));
           if (clazz != null) {
             // For static invokes, the class could be initialized.
             if (type == Invoke.Type.STATIC) {
@@ -253,8 +253,7 @@
         return;
       }
 
-      DexProgramClass clazz =
-          asProgramClassOrNull(appView.definitionFor(encodedField.field.holder));
+      DexProgramClass clazz = asProgramClassOrNull(appView.definitionFor(encodedField.holder()));
       if (clazz == null) {
         return;
       }
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 ae3e7cd..bbcd3c8 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
@@ -328,7 +328,7 @@
       }
     }
     return new CfCode(
-        method.method.holder,
+        method.holder(),
         stackHeightTracker.maxHeight,
         registerAllocator.registersUsed(),
         instructions,
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
index 1f1d2e5..f13653a 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
@@ -427,7 +427,7 @@
   private void buildMethodEnterSynchronization(IRBuilder builder) {
     assert needsGeneratedMethodSynchronization;
     currentlyGeneratingMethodSynchronization = true;
-    DexType type = method.method.holder;
+    DexType type = method.holder();
     int monitorRegister;
     if (isStatic()) {
       monitorRegister = state.push(type).register;
@@ -633,7 +633,7 @@
       return ((CfNew) instruction).getType();
     }
     if (type.isUninitializedThis()) {
-      return method.method.holder;
+      return method.holder();
     }
     assert type.isTop();
     return null;
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 993a69c..d5f28d4 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
@@ -530,7 +530,7 @@
     int argumentIndex = 0;
 
     if (!method.isStatic()) {
-      writeCallback.accept(register, method.method.holder);
+      writeCallback.accept(register, method.holder());
       addThisArgument(register);
       argumentIndex++;
       register++;
@@ -932,7 +932,7 @@
   void addThisArgument(int register) {
     boolean receiverCouldBeNull = context != null && context != method;
     Nullability nullability = receiverCouldBeNull ? maybeNull() : definitelyNotNull();
-    TypeElement receiverType = TypeElement.fromDexType(method.method.holder, nullability, appView);
+    TypeElement receiverType = TypeElement.fromDexType(method.holder(), nullability, appView);
     addThisArgument(register, receiverType);
   }
 
@@ -1463,14 +1463,14 @@
       // therefore we use an invoke-direct instead. We need to do this as the Android Runtime
       // will not allow invoke-virtual of a private method.
       DexMethod invocationMethod = (DexMethod) item;
-      DexType holderType = method.method.holder;
+      DexType holderType = method.holder();
       if (invocationMethod.holder == holderType) {
         DexClass holderClass = appView.definitionFor(holderType);
         assert holderClass != null && holderClass.isProgramClass();
         if (holderClass != null) {
           DexEncodedMethod directTarget = holderClass.lookupDirectMethod(invocationMethod);
           if (directTarget != null && !directTarget.isStatic()) {
-            assert invocationMethod.holder == directTarget.method.holder;
+            assert invocationMethod.holder == directTarget.holder();
             type = Type.DIRECT;
           }
         }
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 cae0c84..405ca67 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
@@ -609,10 +609,10 @@
         if (appView.options().enableNeverMergePrefixes) {
           for (DexString neverMergePrefix : neverMergePrefixes) {
             // Synthetic classes will always be merged.
-            if (method.method.holder.isD8R8SynthesizedClassType()) {
+            if (method.holder().isD8R8SynthesizedClassType()) {
               continue;
             }
-            if (method.method.holder.descriptor.startsWith(neverMergePrefix)) {
+            if (method.holder().descriptor.startsWith(neverMergePrefix)) {
               seenNeverMergePrefix = true;
             } else {
               seenNotNeverMergePrefix = true;
@@ -904,7 +904,7 @@
     ThreadUtils.processItems(
         methods,
         method -> {
-          IRCode code = method.buildIR(appView, appView.appInfo().originFor(method.method.holder));
+          IRCode code = method.buildIR(appView, appView.appInfo().originFor(method.holder()));
           assert code != null;
           assert !method.getCode().isOutlineCode();
           // Instead of repeating all the optimizations of rewriteCode(), only run the
@@ -928,7 +928,7 @@
   }
 
   private void forEachSynthesizedServiceLoaderMethod(DexEncodedMethod method) {
-    IRCode code = method.buildIR(appView, appView.appInfo().originFor(method.method.holder));
+    IRCode code = method.buildIR(appView, appView.appInfo().originFor(method.holder()));
     assert code != null;
     codeRewriter.rewriteMoveResult(code);
     removeDeadCodeAndFinalizeIR(
@@ -1085,7 +1085,7 @@
 
   private Timing rewriteCode(
       DexEncodedMethod method, OptimizationFeedback feedback, MethodProcessor methodProcessor) {
-    Origin origin = appView.appInfo().originFor(method.method.holder);
+    Origin origin = appView.appInfo().originFor(method.holder());
     return ExceptionUtils.withOriginAttachmentHandler(
         origin,
         new MethodPosition(method.method),
@@ -1215,7 +1215,7 @@
 
     if (memberValuePropagation != null) {
       timing.begin("Propagate member values");
-      memberValuePropagation.rewriteWithConstantValues(code, method.method.holder);
+      memberValuePropagation.rewriteWithConstantValues(code, method.holder());
       timing.end();
     }
 
@@ -1284,7 +1284,7 @@
     if (devirtualizer != null) {
       assert code.verifyTypes(appView);
       timing.begin("Devirtualize invoke interface");
-      devirtualizer.devirtualizeInvokeInterface(code, method.method.holder);
+      devirtualizer.devirtualizeInvokeInterface(code, method.holder());
       timing.end();
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
index e742528..328365e 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
@@ -175,7 +175,7 @@
       OptimizationFeedback feedback) {
     // TODO(b/140766440): Make IRConverter#process receive a list of CodeOptimization to conduct.
     //   Then, we can share IRCode creation there.
-    Origin origin = appView.appInfo().originFor(method.method.holder);
+    Origin origin = appView.appInfo().originFor(method.holder());
     if (appView.options().skipIR) {
       feedback.markProcessed(method, ConstraintWithTarget.NEVER);
       return;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index 43db91d..78eaab5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -154,7 +154,7 @@
       if (provider.requiresGenerationOfCode()) {
         DexMethod newMethod = provider.provideMethod(appView);
         methodProviders.putIfAbsent(newMethod, provider);
-        holders.add(code.method.method.holder);
+        holders.add(code.method.holder());
       }
     }
     if (!affectedValues.isEmpty()) {
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 3d16d19..ff5dd2f 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
@@ -294,7 +294,7 @@
       return;
     }
     DexEncodedMethod target = resolution.getSingleTarget();
-    DexClass targetHolder = appView.definitionFor(target.method.holder);
+    DexClass targetHolder = appView.definitionFor(target.holder());
     // Don-t forward if the target is explicitly marked as 'dont-rewrite'
     if (targetHolder == null || dontRewrite(targetHolder, target)) {
       return;
@@ -330,7 +330,7 @@
 
   private boolean isRetargetMethod(DexLibraryClass holder, DexEncodedMethod method) {
     assert needsLibraryInfo();
-    assert holder.type == method.method.holder;
+    assert holder.type == method.holder();
     assert method.isNonPrivateVirtualMethod();
     if (method.isFinal()) {
       return false;
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 2be1832..b5c3f3e 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
@@ -152,12 +152,12 @@
     MethodAccessFlags newAccessFlags = method.accessFlags.copy();
     newAccessFlags.setBridge();
     newAccessFlags.setSynthetic();
-    DexMethod newMethod = factory.createMethod(method.method.holder, newProto, method.method.name);
+    DexMethod newMethod = factory.createMethod(method.holder(), newProto, method.method.name);
     ForwardMethodSourceCode.Builder forwardSourceCodeBuilder =
         ForwardMethodSourceCode.builder(newMethod);
     forwardSourceCodeBuilder
         .setReceiver(clazz.type)
-        .setTargetReceiver(method.method.holder)
+        .setTargetReceiver(method.holder())
         .setTarget(method.method)
         .setInvokeType(Invoke.Type.VIRTUAL)
         .setCastResult();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/D8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/D8NestBasedAccessDesugaring.java
index 7b53a35..738f4aa 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/D8NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/D8NestBasedAccessDesugaring.java
@@ -49,7 +49,7 @@
 
   public void rewriteNestBasedAccesses(
       DexEncodedMethod encodedMethod, IRCode code, AppView<?> appView) {
-    DexClass currentClass = appView.definitionFor(encodedMethod.method.holder);
+    DexClass currentClass = appView.definitionFor(encodedMethod.holder());
     assert currentClass != null;
     if (!currentClass.isInANest()) {
       return;
@@ -120,7 +120,7 @@
 
   private void addDeferredBridges(Collection<DexEncodedMethod> bridges) {
     for (DexEncodedMethod bridge : bridges) {
-      DexClass holder = definitionFor(bridge.method.holder);
+      DexClass holder = definitionFor(bridge.holder());
       assert holder != null && holder.isProgramClass();
       holder.asProgramClass().addMethod(bridge);
     }
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 c81eedb..0d771c3 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
@@ -106,7 +106,7 @@
 
   public void desugar(IRCode code) {
 
-    if (wrapperSynthesizor.hasSynthesized(code.method.method.holder)) {
+    if (wrapperSynthesizor.hasSynthesized(code.method.holder())) {
       return;
     }
 
@@ -140,7 +140,7 @@
     if (!shouldRegisterCallback(encodedMethod)) {
       return true;
     }
-    DexProgramClass holderClass = appView.definitionForProgramType(encodedMethod.method.holder);
+    DexProgramClass holderClass = appView.definitionForProgramType(encodedMethod.holder());
     DexMethod installedCallback =
         methodWithVivifiedTypeInSignature(encodedMethod.method, holderClass.type, appView);
     assert holderClass.lookupMethod(installedCallback) != null;
@@ -161,7 +161,7 @@
 
   public void registerCallbackIfRequired(DexEncodedMethod encodedMethod) {
     if (shouldRegisterCallback(encodedMethod)) {
-      DexClass dexClass = appView.definitionFor(encodedMethod.method.holder);
+      DexClass dexClass = appView.definitionFor(encodedMethod.holder());
       assert dexClass != null;
       registerCallback(dexClass, encodedMethod);
     }
@@ -253,7 +253,7 @@
   }
 
   private synchronized void addCallBackSignature(DexClass dexClass, DexEncodedMethod method) {
-    assert dexClass.type == method.method.holder;
+    assert dexClass.type == method.holder();
     if (callBackMethods.computeIfAbsent(dexClass, key -> new HashSet<>()).add(method)) {
       pendingCallBackMethods.computeIfAbsent(dexClass, key -> new ArrayList<>()).add(method);
     }
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 3949767..76ceee5 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
@@ -118,7 +118,7 @@
             appView
                 .appInfo()
                 .withClassHierarchy()
-                .lookupSuperTarget(invoke.getInvokedMethod(), code.method.method.holder);
+                .lookupSuperTarget(invoke.getInvokedMethod(), code.method.holder());
         // Final methods can be rewritten as a normal invoke.
         if (dexEncodedMethod != null && !dexEncodedMethod.isFinal()) {
           DexMethod retargetMethod =
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 30bc78e..6552db4 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
@@ -223,7 +223,7 @@
     DexTypeList interfaces =
         isItf ? new DexTypeList(new DexType[] {wrappingType}) : DexTypeList.empty();
     return new DexProgramClass(
-        wrapperField.field.holder,
+        wrapperField.holder(),
         null,
         new SynthesizedOrigin("Desugared library API Converter", getClass()),
         ClassAccessFlags.fromSharedAccessFlags(
@@ -260,23 +260,24 @@
     //   return v3;
     Set<DexMethod> finalMethods = Sets.newIdentityHashSet();
     for (DexEncodedMethod dexEncodedMethod : dexMethods) {
-      DexClass holderClass = appView.definitionFor(dexEncodedMethod.method.holder);
+      DexClass holderClass = appView.definitionFor(dexEncodedMethod.holder());
       boolean isInterface;
       if (holderClass == null) {
-        assert appView.options().desugaredLibraryConfiguration.getEmulateLibraryInterface()
-            .containsValue(dexEncodedMethod.method.holder);
+        assert appView
+            .options()
+            .desugaredLibraryConfiguration
+            .getEmulateLibraryInterface()
+            .containsValue(dexEncodedMethod.holder());
         isInterface = true;
       } else {
         isInterface = holderClass.isInterface();
       }
       DexMethod methodToInstall =
           factory.createMethod(
-              wrapperField.field.holder,
-              dexEncodedMethod.method.proto,
-              dexEncodedMethod.method.name);
+              wrapperField.holder(), dexEncodedMethod.method.proto, dexEncodedMethod.method.name);
       CfCode cfCode;
       if (dexEncodedMethod.isFinal()) {
-        invalidWrappers.add(wrapperField.field.holder);
+        invalidWrappers.add(wrapperField.holder());
         finalMethods.add(dexEncodedMethod.method);
         continue;
       } else {
@@ -312,15 +313,15 @@
     //   return v3;
     Set<DexMethod> finalMethods = Sets.newIdentityHashSet();
     for (DexEncodedMethod dexEncodedMethod : dexMethods) {
-      DexClass holderClass = appView.definitionFor(dexEncodedMethod.method.holder);
+      DexClass holderClass = appView.definitionFor(dexEncodedMethod.holder());
       assert holderClass != null || appView.options().isDesugaredLibraryCompilation();
       boolean isInterface = holderClass == null || holderClass.isInterface();
       DexMethod methodToInstall =
           DesugaredLibraryAPIConverter.methodWithVivifiedTypeInSignature(
-              dexEncodedMethod.method, wrapperField.field.holder, appView);
+              dexEncodedMethod.method, wrapperField.holder(), appView);
       CfCode cfCode;
       if (dexEncodedMethod.isFinal()) {
-        invalidWrappers.add(wrapperField.field.holder);
+        invalidWrappers.add(wrapperField.holder());
         finalMethods.add(dexEncodedMethod.method);
         continue;
       } else {
@@ -342,7 +343,7 @@
     List<DexEncodedMethod> generatedMethods = new ArrayList<>();
     // Generate only abstract methods for library override detection.
     for (DexEncodedMethod dexEncodedMethod : dexMethods) {
-      DexClass holderClass = appView.definitionFor(dexEncodedMethod.method.holder);
+      DexClass holderClass = appView.definitionFor(dexEncodedMethod.holder());
       assert holderClass != null || appView.options().isDesugaredLibraryCompilation();
       if (!dexEncodedMethod.isFinal()) {
         DexMethod methodToInstall =
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 1a4c416..e7c165d 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
@@ -238,7 +238,7 @@
                         invokeStatic.outValue(), invokeStatic.arguments()));
                 requiredDispatchClasses
                     .computeIfAbsent(clazz.asLibraryClass(), k -> Sets.newConcurrentHashSet())
-                    .add(appInfo.definitionFor(encodedMethod.method.holder).asProgramClass());
+                    .add(appInfo.definitionFor(encodedMethod.holder()).asProgramClass());
               }
             } else {
               instructions.replaceCurrentInstruction(
@@ -269,8 +269,7 @@
             // WARNING: This may result in incorrect code on older platforms!
             // Retarget call to an appropriate method of companion class.
             DexMethod amendedMethod =
-                amendDefaultMethod(
-                    appInfo.definitionFor(encodedMethod.method.holder), invokedMethod);
+                amendDefaultMethod(appInfo.definitionFor(encodedMethod.holder()), invokedMethod);
             instructions.replaceCurrentInstruction(
                 new InvokeStatic(defaultAsMethodOfCompanionClass(amendedMethod),
                     invokeSuper.outValue(), invokeSuper.arguments()));
@@ -284,9 +283,9 @@
               DexEncodedMethod dexEncodedMethod =
                   appView
                       .appInfo()
-                      .lookupSuperTarget(invokeSuper.getInvokedMethod(), code.method.method.holder);
+                      .lookupSuperTarget(invokeSuper.getInvokedMethod(), code.method.holder());
               if (dexEncodedMethod != null) {
-                DexClass dexClass = appView.definitionFor(dexEncodedMethod.method.holder);
+                DexClass dexClass = appView.definitionFor(dexEncodedMethod.holder());
                 if (dexClass != null && dexClass.isLibraryClass()) {
                   // Rewriting is required because the super invoke resolves into a missing
                   // method (method is on desugared library). Find out if it needs to be
@@ -418,8 +417,8 @@
       // interfaces.
       return null;
     }
-    if (!singleTarget.isAbstract() && isEmulatedInterface(singleTarget.method.holder)) {
-      return singleTarget.method.holder;
+    if (!singleTarget.isAbstract() && isEmulatedInterface(singleTarget.holder())) {
+      return singleTarget.holder();
     }
     return null;
   }
@@ -616,8 +615,8 @@
         }
         emulationMethods.add(
             DexEncodedMethod.toEmulateDispatchLibraryMethod(
-                method.method.holder,
-                emulateInterfaceLibraryMethod(method.method, method.method.holder, factory),
+                method.holder(),
+                emulateInterfaceLibraryMethod(method.method, method.holder(), factory),
                 companionMethod,
                 libraryMethod,
                 extraDispatchCases,
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 4409c30..ab5a9cd 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
@@ -320,7 +320,7 @@
     } else {
       assert code.isCfCode();
       for (CfInstruction insn : code.asCfCode().getInstructions()) {
-        if (insn instanceof CfInvoke && ((CfInvoke) insn).isInvokeSuper(method.method.holder)) {
+        if (insn instanceof CfInvoke && ((CfInvoke) insn).isInvokeSuper(method.holder())) {
           return false;
         }
       }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
index d440b01..2ac43f0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaDescriptor.java
@@ -96,7 +96,7 @@
         invocationContext == null ? null : lookupTargetMethod(appInfo, invocationContext);
     if (targetMethod != null) {
       targetAccessFlags = targetMethod.accessFlags.copy();
-      targetHolder = targetMethod.method.holder;
+      targetHolder = targetMethod.holder();
     } else {
       targetAccessFlags = null;
       targetHolder = null;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
index 4ee35d6..d6d698e 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
@@ -135,7 +135,7 @@
    */
   public void desugarLambdas(DexEncodedMethod encodedMethod, IRCode code) {
     Set<Value> affectedValues = Sets.newIdentityHashSet();
-    DexType currentType = encodedMethod.method.holder;
+    DexType currentType = encodedMethod.holder();
     ListIterator<BasicBlock> blocks = code.listIterator();
     while (blocks.hasNext()) {
       BasicBlock block = blocks.next();
@@ -145,7 +145,7 @@
         if (instruction.isInvokeCustom()) {
           InvokeCustom invoke = instruction.asInvokeCustom();
           LambdaDescriptor descriptor =
-              inferLambdaDescriptor(invoke.getCallSite(), encodedMethod.method.holder);
+              inferLambdaDescriptor(invoke.getCallSite(), encodedMethod.holder());
           if (descriptor == LambdaDescriptor.MATCH_FAILED) {
             continue;
           }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
index b78757d..70f2b61 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
@@ -238,7 +238,7 @@
   }
 
   private DexMethod computeFieldBridge(DexEncodedField field, boolean isGet) {
-    DexType holderType = field.field.holder;
+    DexType holderType = field.holder();
     DexType fieldType = field.field.type;
     int bridgeParameterCount =
         BooleanUtils.intValue(!field.isStatic()) + BooleanUtils.intValue(!isGet);
@@ -259,10 +259,10 @@
   boolean invokeRequiresRewriting(DexEncodedMethod method, DexClass contextClass) {
     assert method != null;
     // Rewrite only when targeting other nest members private fields.
-    if (!method.accessFlags.isPrivate() || method.method.holder == contextClass.type) {
+    if (!method.accessFlags.isPrivate() || method.holder() == contextClass.type) {
       return false;
     }
-    DexClass methodHolder = definitionFor(method.method.holder);
+    DexClass methodHolder = definitionFor(method.holder());
     assert methodHolder != null; // from encodedMethod
     return methodHolder.getNestHost() == contextClass.getNestHost();
   }
@@ -270,10 +270,10 @@
   boolean fieldAccessRequiresRewriting(DexEncodedField field, DexClass contextClass) {
     assert field != null;
     // Rewrite only when targeting other nest members private fields.
-    if (!field.accessFlags.isPrivate() || field.field.holder == contextClass.type) {
+    if (!field.accessFlags.isPrivate() || field.holder() == contextClass.type) {
       return false;
     }
-    DexClass fieldHolder = definitionFor(field.field.holder);
+    DexClass fieldHolder = definitionFor(field.holder());
     assert fieldHolder != null; // from encodedField
     return fieldHolder.getNestHost() == contextClass.getNestHost();
   }
@@ -295,7 +295,7 @@
   }
 
   DexMethod ensureFieldAccessBridge(DexEncodedField field, boolean isGet) {
-    DexClass holder = definitionFor(field.field.holder);
+    DexClass holder = definitionFor(field.holder());
     assert holder != null;
     DexMethod bridgeMethod = computeFieldBridge(field, isGet);
     if (holderRequiresBridge(holder)) {
@@ -314,7 +314,7 @@
 
   DexMethod ensureInvokeBridge(DexEncodedMethod method) {
     // We add bridges only when targeting other nest members.
-    DexClass holder = definitionFor(method.method.holder);
+    DexClass holder = definitionFor(method.holder());
     assert holder != null;
     DexMethod bridgeMethod;
     if (method.isInstanceInitializer()) {
@@ -508,7 +508,7 @@
     }
 
     public DexType getHolder() {
-      return field.field.holder;
+      return field.holder();
     }
 
     public DexField getField() {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java
index c4c9bd7..ca10fe6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java
@@ -56,7 +56,7 @@
   private <E> void addDeferredBridgesAndMapMethods(
       Map<E, DexEncodedMethod> bridges, BiConsumer<E, DexMethod> lensInserter) {
     for (Map.Entry<E, DexEncodedMethod> entry : bridges.entrySet()) {
-      DexClass holder = definitionFor(entry.getValue().method.holder);
+      DexClass holder = definitionFor(entry.getValue().holder());
       assert holder != null && holder.isProgramClass();
       holder.asProgramClass().addMethod(entry.getValue());
       lensInserter.accept(entry.getKey(), entry.getValue().method);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/TwrCloseResourceRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/TwrCloseResourceRewriter.java
index 17250cf..e477fe3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/TwrCloseResourceRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/TwrCloseResourceRewriter.java
@@ -99,7 +99,7 @@
           new InvokeStatic(twrCloseResourceMethod, null, invoke.inValues()));
 
       // Mark as a class referencing utility class.
-      referencingClasses.add(appInfo.definitionFor(code.method.method.holder).asProgramClass());
+      referencingClasses.add(appInfo.definitionFor(code.method.holder()).asProgramClass());
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/AssertionsRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/AssertionsRewriter.java
index da20118..a356e8b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/AssertionsRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/AssertionsRewriter.java
@@ -112,18 +112,18 @@
           break;
         case PACKAGE:
           if (entry.value.size == 0) {
-            if (!method.method.holder.descriptor.contains(dexItemFactory.descriptorSeparator)) {
+            if (!method.holder().descriptor.contains(dexItemFactory.descriptorSeparator)) {
               transformation = entry.entry.getTransformation();
             }
-          } else if (method.method.holder.descriptor.startsWith(entry.value)) {
+          } else if (method.holder().descriptor.startsWith(entry.value)) {
             transformation = entry.entry.getTransformation();
           }
           break;
         case CLASS:
-          if (method.method.holder.descriptor.equals(entry.value)) {
+          if (method.holder().descriptor.equals(entry.value)) {
             transformation = entry.entry.getTransformation();
           }
-          if (isDescriptorForClassOrInnerClass(entry.value, method.method.holder.descriptor)) {
+          if (isDescriptorForClassOrInnerClass(entry.value, method.holder().descriptor)) {
             transformation = entry.entry.getTransformation();
           }
           break;
@@ -311,7 +311,7 @@
     if (method.isClassInitializer()) {
       clinit = method;
     } else {
-      DexClass clazz = appView.definitionFor(method.method.holder);
+      DexClass clazz = appView.definitionFor(method.holder());
       if (clazz == null) {
         return;
       }
@@ -328,7 +328,7 @@
       if (current.isInvokeMethod()) {
         InvokeMethod invoke = current.asInvokeMethod();
         if (invoke.getInvokedMethod() == dexItemFactory.classMethods.desiredAssertionStatus) {
-          if (method.method.holder == dexItemFactory.kotlin.kotlinAssertions) {
+          if (method.holder() == dexItemFactory.kotlin.kotlinAssertions) {
             rewriteKotlinAssertionEnable(code, transformation, iterator, invoke);
           } else {
             iterator.replaceCurrentInstruction(code.createIntConstant(0));
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 368b58a..35895b7 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
@@ -98,7 +98,7 @@
             continue;
           }
         }
-        Collection<DexEncodedMethod> targets = invoke.lookupTargets(appView, context.method.holder);
+        Collection<DexEncodedMethod> targets = invoke.lookupTargets(appView, context.holder());
         assert invoke.isInvokeMethodWithDynamicDispatch()
             // For other invocation types, the size of targets should be at most one.
             || targets == null || targets.size() <= 1;
@@ -231,7 +231,7 @@
       if (abstractValue.isSingleValue()) {
         assert appView.options().enablePropagationOfConstantsAtCallSites;
         SingleValue singleValue = abstractValue.asSingleValue();
-        if (singleValue.isMaterializableInContext(appView, code.method.method.holder)) {
+        if (singleValue.isMaterializableInContext(appView, code.method.holder())) {
           Instruction replacement =
               singleValue.createMaterializingInstruction(appView, code, instr);
           replacement.setPosition(instr.getPosition());
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 025c178..ce853a2 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
@@ -133,7 +133,7 @@
       return ClassInitializerDefaultsResult.empty();
     }
 
-    DexClass clazz = appView.definitionFor(method.method.holder);
+    DexClass clazz = appView.definitionFor(method.holder());
     if (clazz == null) {
       return ClassInitializerDefaultsResult.empty();
     }
@@ -160,7 +160,7 @@
       Value value = put.value();
       if (unnecessaryStaticPuts.contains(put)) {
         if (fieldType == dexItemFactory.stringType) {
-          fieldsWithStaticValues.put(field, getDexStringValue(value, method.method.holder));
+          fieldsWithStaticValues.put(field, getDexStringValue(value, method.holder()));
         } else if (fieldType.isClassType() || fieldType.isArrayType()) {
           if (value.isZero()) {
             fieldsWithStaticValues.put(field, DexValueNull.NULL);
@@ -380,7 +380,7 @@
           } else if (instruction.isStaticGet()) {
             StaticGet get = instruction.asStaticGet();
             DexEncodedField field = appView.appInfo().resolveField(get.getField());
-            if (field != null && field.field.holder == clazz.type) {
+            if (field != null && field.holder() == clazz.type) {
               isReadBefore.add(field.field);
             } else if (instruction.instructionMayHaveSideEffects(appView, clazz.type)) {
               // Reading another field is only OK if the read does not have side-effects.
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 5b78d8a..c390d5a 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
@@ -1115,7 +1115,7 @@
     BasicBlock defaultTarget = theSwitch.fallthroughBlock();
     SwitchCaseEliminator eliminator = null;
     BasicBlockBehavioralSubsumption behavioralSubsumption =
-        new BasicBlockBehavioralSubsumption(appView, code.method.method.holder);
+        new BasicBlockBehavioralSubsumption(appView, code.method.holder());
 
     // Compute the set of switch cases that can be removed.
     for (int i = 0; i < theSwitch.numberOfKeys(); i++) {
@@ -1231,7 +1231,7 @@
         }
 
         // Check if the invoked method is known to return one of its arguments.
-        DexEncodedMethod target = invoke.lookupSingleTarget(appView, code.method.method.holder);
+        DexEncodedMethod target = invoke.lookupSingleTarget(appView, code.method.holder());
         if (target != null && target.getOptimizationInfo().returnsArgument()) {
           int argumentIndex = target.getOptimizationInfo().getReturnedArgument();
           // Replace the out value of the invoke with the argument and ignore the out value.
@@ -1353,7 +1353,7 @@
     // If the cast type is not accessible in the current context, we should not remove the cast
     // in order to preserve IllegalAccessError. Note that JVM and ART behave differently: see
     // {@link com.android.tools.r8.ir.optimize.checkcast.IllegalAccessErrorTest}.
-    if (!isTypeVisibleFromContext(appView, code.method.method.holder, castType)) {
+    if (!isTypeVisibleFromContext(appView, code.method.holder(), castType)) {
       return RemoveCheckCastInstructionIfTrivialResult.NO_REMOVALS;
     }
 
@@ -1410,7 +1410,7 @@
       InstanceOf instanceOf, InstructionListIterator it, IRCode code) {
     // If the instance-of type is not accessible in the current context, we should not remove the
     // instance-of instruction in order to preserve IllegalAccessError.
-    if (!isTypeVisibleFromContext(appView, code.method.method.holder, instanceOf.type())) {
+    if (!isTypeVisibleFromContext(appView, code.method.holder(), instanceOf.type())) {
       return false;
     }
 
@@ -2469,7 +2469,7 @@
               }
             }
           } else {
-            DexType context = code.method.method.holder;
+            DexType context = code.method.holder();
             AbstractValue abstractValue = lhs.getAbstractValue(appView, context);
             if (abstractValue.isSingleConstClassValue() || abstractValue.isSingleFieldValue()) {
               AbstractValue otherAbstractValue = rhs.getAbstractValue(appView, context);
@@ -2761,7 +2761,7 @@
 
         InvokeMethod invoke = insn.asInvokeMethod();
         DexEncodedMethod singleTarget =
-            invoke.lookupSingleTarget(appView.withLiveness(), code.method.method.holder);
+            invoke.lookupSingleTarget(appView.withLiveness(), code.method.holder());
         if (singleTarget == null || !singleTarget.getOptimizationInfo().neverReturnsNormally()) {
           continue;
         }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
index 2dff525..c98c262 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
@@ -88,7 +88,7 @@
 
   public void canonicalize(AppView<?> appView, IRCode code) {
     DexEncodedMethod method = code.method;
-    DexType context = method.method.holder;
+    DexType context = method.holder();
     Object2ObjectLinkedOpenCustomHashMap<Instruction, List<Value>> valuesDefinedByConstant =
         new Object2ObjectLinkedOpenCustomHashMap<>(
             new Strategy<Instruction>() {
@@ -149,8 +149,7 @@
           continue;
         }
         SingleFieldValue singleFieldValue = abstractValue.asSingleFieldValue();
-        if (method.isClassInitializer()
-            && method.method.holder == singleFieldValue.getField().holder) {
+        if (method.isClassInitializer() && method.holder() == singleFieldValue.getField().holder) {
           // Avoid that canonicalization inserts a read before the unique write in the class
           // initializer, as that would change the program behavior.
           continue;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index d225220..d9773d9 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -105,7 +105,7 @@
       return true;
     }
 
-    DexClass clazz = appView.definitionFor(singleTarget.method.holder);
+    DexClass clazz = appView.definitionFor(singleTarget.holder());
     if (!clazz.isProgramClass()) {
       if (clazz.isClasspathClass()) {
         whyAreYouNotInliningReporter.reportClasspathMethod();
@@ -211,12 +211,12 @@
     // Don't inline code with references beyond root main dex classes into a root main dex class.
     // If we do this it can increase the size of the main dex dependent classes.
     if (reason != Reason.FORCE
-        && inlineeRefersToClassesNotInMainDex(method.method.holder, singleTarget)) {
+        && inlineeRefersToClassesNotInMainDex(method.holder(), singleTarget)) {
       whyAreYouNotInliningReporter.reportInlineeRefersToClassesNotInMainDex();
       return false;
     }
     assert reason != Reason.FORCE
-        || !inlineeRefersToClassesNotInMainDex(method.method.holder, singleTarget);
+        || !inlineeRefersToClassesNotInMainDex(method.holder(), singleTarget);
     return true;
   }
 
@@ -360,8 +360,8 @@
     // - the current method has already triggered the holder for the target method to be
     //   initialized, or
     // - there is no non-trivial class initializer.
-    DexType targetHolder = target.method.holder;
-    if (appView.appInfo().isSubtype(method.method.holder, targetHolder)) {
+    DexType targetHolder = target.holder();
+    if (appView.appInfo().isSubtype(method.holder(), targetHolder)) {
       return true;
     }
     DexClass clazz = appView.definitionFor(targetHolder);
@@ -374,14 +374,14 @@
           appView.withInitializedClassesInInstanceMethods(
               analysis ->
                   analysis.isClassDefinitelyLoadedInInstanceMethodsOn(
-                      target.method.holder, method.method.holder),
+                      target.holder(), method.holder()),
               false);
       if (targetIsGuaranteedToBeInitialized) {
         return true;
       }
     }
     if (classInitializationAnalysis.isClassDefinitelyLoadedBeforeInstruction(
-        target.method.holder, invoke)) {
+        target.holder(), invoke)) {
       return true;
     }
     // Check for class initializer side effects when loading this class, as inlining might remove
@@ -445,8 +445,8 @@
 
     // Allow inlining a constructor into a constructor of the same class, as the constructor code
     // is expected to adhere to the VM specification.
-    DexType callerMethodHolder = method.method.holder;
-    DexType calleeMethodHolder = inlinee.method.method.holder;
+    DexType callerMethodHolder = method.holder();
+    DexType calleeMethodHolder = inlinee.method.holder();
     // Calling a constructor on the same class from a constructor can always be inlined.
     if (method.isInstanceInitializer() && callerMethodHolder == calleeMethodHolder) {
       return true;
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 82ea8ab..897b85b 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
@@ -136,7 +136,7 @@
         if (target == null) {
           continue;
         }
-        DexType holderType = target.method.holder;
+        DexType holderType = target.holder();
         DexClass holderClass = appView.definitionFor(holderType);
         // Make sure we are not landing on another interface, e.g., interface's default method.
         if (holderClass == null || holderClass.isInterface()) {
@@ -284,7 +284,7 @@
       // Most likely due to a missing class, or invoke is already as specific as it gets.
       return target;
     }
-    DexClass newTargetClass = appView.definitionFor(newTarget.method.holder);
+    DexClass newTargetClass = appView.definitionFor(newTarget.holder());
     if (newTargetClass == null
         || newTargetClass.isLibraryClass()
         || !canInvokeTargetWithInvokeVirtual(newTarget)
@@ -296,13 +296,12 @@
   }
 
   private boolean canInvokeTargetWithInvokeVirtual(DexEncodedMethod target) {
-    return target.isNonPrivateVirtualMethod()
-        && appView.isInterface(target.method.holder).isFalse();
+    return target.isNonPrivateVirtualMethod() && appView.isInterface(target.holder()).isFalse();
   }
 
   private boolean hasAccessToInvokeTargetFromContext(DexEncodedMethod target, DexType context) {
     assert !target.accessFlags.isPrivate();
-    DexType holder = target.method.holder;
+    DexType holder = target.holder();
     if (holder == context) {
       // It is always safe to invoke a method from the same enclosing class.
       return true;
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 8048e3a..d518ef6 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
@@ -78,8 +78,7 @@
               TypeElement.fromDexType(invokedMethod.holder, definitelyNotNull(), appView);
           dynamicLowerBoundType = null;
         } else {
-          DexEncodedMethod singleTarget =
-              invoke.lookupSingleTarget(appView, code.method.method.holder);
+          DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, code.method.holder());
           if (singleTarget == null) {
             continue;
           }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java b/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java
index 5dba772..f59a458 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/IdempotentFunctionCallCanonicalizer.java
@@ -110,7 +110,7 @@
               }
             });
 
-    DexType context = code.method.method.holder;
+    DexType context = code.method.holder();
     // Collect invocations along with arguments.
     for (BasicBlock block : code.blocks) {
       for (Instruction current : block.getInstructions()) {
@@ -143,7 +143,7 @@
           }
           // Verify that the target method is accessible in the current context.
           if (!isMemberVisibleFromOriginalContext(
-              appView, context, target.method.holder, target.accessFlags)) {
+              appView, context, target.holder(), target.accessFlags)) {
             continue;
           }
           // Check if the call could throw a NPE as a result of the receiver being null.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index b56dece..91d2227 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -164,7 +164,7 @@
         new InliningConstraints(appView, GraphLense.getIdentityLense());
     for (Instruction instruction : code.instructions()) {
       ConstraintWithTarget state =
-          instructionAllowedForInlining(instruction, inliningConstraints, method.method.holder);
+          instructionAllowedForInlining(instruction, inliningConstraints, method.holder());
       if (state == ConstraintWithTarget.NEVER) {
         result = state;
         break;
@@ -192,12 +192,12 @@
   }
 
   boolean hasInliningAccess(DexEncodedMethod method, DexEncodedMethod target) {
-    if (!isVisibleWithFlags(target.method.holder, method.method.holder, target.accessFlags)) {
+    if (!isVisibleWithFlags(target.holder(), method.holder(), target.accessFlags)) {
       return false;
     }
     // The class needs also to be visible for us to have access.
-    DexClass targetClass = appView.definitionFor(target.method.holder);
-    return isVisibleWithFlags(target.method.holder, method.method.holder, targetClass.accessFlags);
+    DexClass targetClass = appView.definitionFor(target.holder());
+    return isVisibleWithFlags(target.holder(), method.holder(), targetClass.accessFlags);
   }
 
   private boolean isVisibleWithFlags(DexType target, DexType context, AccessFlags flags) {
@@ -710,7 +710,7 @@
           lockValue =
               code.createValue(
                   TypeElement.fromDexType(dexItemFactory.objectType, definitelyNotNull(), appView));
-          monitorEnterBlockIterator.add(new ConstClass(lockValue, target.method.holder));
+          monitorEnterBlockIterator.add(new ConstClass(lockValue, target.holder()));
         } else {
           lockValue = entryBlock.getInstructions().getFirst().asArgument().outValue();
         }
@@ -964,7 +964,7 @@
         if (current.isInvokeMethod()) {
           InvokeMethod invoke = current.asInvokeMethod();
           // TODO(b/142116551): This should be equivalent to invoke.lookupSingleTarget()!
-          DexEncodedMethod singleTarget = oracle.lookupSingleTarget(invoke, context.method.holder);
+          DexEncodedMethod singleTarget = oracle.lookupSingleTarget(invoke, context.holder());
           if (singleTarget == null) {
             WhyAreYouNotInliningReporter.handleInvokeWithUnknownTarget(invoke, appView, context);
             continue;
@@ -1115,8 +1115,8 @@
         // method holder as a fallback.
         receiverType = invoke.getInvokedMethod().holder;
       }
-      if (!appView.appInfo().isSubtype(receiverType, target.method.holder)) {
-        return target.method.holder;
+      if (!appView.appInfo().isSubtype(receiverType, target.holder())) {
+        return target.holder();
       }
     }
     return null;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
index a1307a0..ea77caf 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
@@ -197,7 +197,7 @@
     DexEncodedMethod alternativeDexEncodedMethod =
         lookupFunction.apply(singleResolutionResult, superContext);
     if (alternativeDexEncodedMethod != null
-        && alternativeDexEncodedMethod.method.holder == superContext.type) {
+        && alternativeDexEncodedMethod.holder() == superContext.type) {
       return alternativeDexEncodedMethod;
     }
     return null;
@@ -354,8 +354,8 @@
       // `invocationContext` has access to the definition of the field.
       //
       // See, for example, InlineNonReboundFieldTest (b/128604123).
-      if (field.holder != target.field.holder) {
-        DexType actualFieldHolder = graphLense.lookupType(target.field.holder);
+      if (field.holder != target.holder()) {
+        DexType actualFieldHolder = graphLense.lookupType(target.holder());
         fieldConstraintWithTarget =
             ConstraintWithTarget.meet(
                 fieldConstraintWithTarget,
@@ -379,7 +379,7 @@
       return ConstraintWithTarget.ALWAYS;
     }
     if (target != null) {
-      DexType methodHolder = graphLense.lookupType(target.method.holder);
+      DexType methodHolder = graphLense.lookupType(target.holder());
       DexClass methodClass = appView.definitionFor(methodHolder);
       if (methodClass != null) {
         if (!allowStaticInterfaceMethodCalls && methodClass.isInterface() && target.hasCode()) {
@@ -423,7 +423,7 @@
       return ConstraintWithTarget.NEVER;
     }
 
-    DexType methodHolder = graphLense.lookupType(resolutionTarget.method.holder);
+    DexType methodHolder = graphLense.lookupType(resolutionTarget.holder());
     DexClass methodClass = appView.definitionFor(methodHolder);
     assert methodClass != null;
     ConstraintWithTarget methodConstraintWithTarget =
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/NestUtils.java b/src/main/java/com/android/tools/r8/ir/optimize/NestUtils.java
index c6694f4..508e394 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/NestUtils.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/NestUtils.java
@@ -46,7 +46,7 @@
     InstructionListIterator iterator = code.instructionListIterator();
     DexClass callerHolderClass = appView.definitionFor(callerHolder);
     assert callerHolderClass != null;
-    assert code.method.method.holder != callerHolder;
+    assert code.method.holder() != callerHolder;
     while (iterator.hasNext()) {
       Instruction instruction = iterator.next();
       if (instruction.isInvokeDirect()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java b/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
index 15904c5..2e41703 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
@@ -98,8 +98,7 @@
             }
           }
 
-          DexEncodedMethod singleTarget =
-              invoke.lookupSingleTarget(appView, code.method.method.holder);
+          DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, code.method.holder());
           if (singleTarget != null) {
             MethodOptimizationInfo optimizationInfo = singleTarget.getOptimizationInfo();
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
index ab9fa71..d9ebcf6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
@@ -862,7 +862,7 @@
       // See whether we could move this invoke somewhere else. We reuse the logic from inlining
       // here, as the constraints are the same.
       ConstraintWithTarget constraint =
-          invoke.inliningConstraint(inliningConstraints, method.method.holder);
+          invoke.inliningConstraint(inliningConstraints, method.holder());
       if (constraint != ConstraintWithTarget.ALWAYS) {
         return false;
       }
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 de9d4cc..e94bb7b 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
@@ -150,7 +150,7 @@
     if (appView.enableWholeProgramOptimizations()) {
       definition = appView.appInfo().resolveField(field);
     } else {
-      if (field.holder != method.method.holder) {
+      if (field.holder != method.holder()) {
         return true;
       }
       definition = appView.definitionFor(field);
@@ -159,7 +159,7 @@
   }
 
   public void run() {
-    DexType context = method.method.holder;
+    DexType context = method.holder();
     for (BasicBlock block : dominatorTree.getSortedBlocks()) {
       activeInitializedClasses =
           activeInitializedClassesAtEntry.containsKey(block)
@@ -383,7 +383,7 @@
       }
       keysToRemove.forEach(activeInstanceFieldValues::remove);
     } else if (instruction.isStaticPut()) {
-      if (field.holder != code.method.method.holder) {
+      if (field.holder != code.method.holder()) {
         // Accessing a static field on a different object could cause <clinit> to run which
         // could modify any static field on any other object.
         activeStaticFieldValues.clear();
@@ -391,7 +391,7 @@
         activeStaticFieldValues.remove(field);
       }
     } else if (instruction.isStaticGet()) {
-      if (field.holder != code.method.method.holder) {
+      if (field.holder != code.method.holder()) {
         // Accessing a static field on a different object could cause <clinit> to run which
         // could modify any static field on any other object.
         activeStaticFieldValues.clear();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
index 1b56e8c..1e19dea 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
@@ -36,7 +36,7 @@
   public static void rewriteGetClassOrForNameToConstClass(
       AppView<AppInfoWithLiveness> appView, IRCode code) {
     Set<Value> affectedValues = Sets.newIdentityHashSet();
-    DexType context = code.method.method.holder;
+    DexType context = code.method.holder();
     ClassInitializationAnalysis classInitializationAnalysis =
         new ClassInitializationAnalysis(appView, code);
     for (BasicBlock block : code.blocks) {
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 8e0858a..6b854e6 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
@@ -351,8 +351,7 @@
         Instruction instruction = instructionIterator.next();
         if (instruction.throwsOnNullInput()) {
           Value couldBeNullValue = instruction.getNonNullInput();
-          if (isThrowNullCandidate(
-              couldBeNullValue, instruction, appView, code.method.method.holder)) {
+          if (isThrowNullCandidate(couldBeNullValue, instruction, appView, code.method.holder())) {
             if (instruction.isInstanceGet() || instruction.isInstancePut()) {
               ++numberOfInstanceGetOrInstancePutWithNullReceiver;
             } else if (instruction.isInvokeMethodWithReceiver()) {
@@ -451,7 +450,7 @@
       IRCode code,
       AssumeDynamicTypeRemover assumeDynamicTypeRemover,
       Set<Value> affectedValues) {
-    DexType context = code.method.method.holder;
+    DexType context = code.method.holder();
     DexField field = instruction.getField();
     DexType fieldType = field.type;
     if (fieldType.isAlwaysNull(appView)) {
@@ -507,7 +506,7 @@
       AssumeDynamicTypeRemover assumeDynamicTypeRemover,
       Set<BasicBlock> blocksToBeRemoved,
       Set<Value> affectedValues) {
-    DexEncodedMethod target = invoke.lookupSingleTarget(appView, code.method.method.holder);
+    DexEncodedMethod target = invoke.lookupSingleTarget(appView, code.method.holder());
     if (target == null) {
       return;
     }
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 db393ed..7b60b90 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
@@ -157,8 +157,7 @@
           // Constructors must be named `<init>`.
           return null;
         }
-        newSignature =
-            appView.dexItemFactory().createMethod(method.method.holder, newProto, newName);
+        newSignature = appView.dexItemFactory().createMethod(method.holder(), newProto, newName);
         count++;
       } while (!isMethodSignatureAvailable(newSignature));
       return newSignature;
@@ -198,8 +197,7 @@
           // Constructors must be named `<init>`.
           return null;
         }
-        newSignature =
-            appView.dexItemFactory().createMethod(method.method.holder, newProto, newName);
+        newSignature = appView.dexItemFactory().createMethod(method.holder(), newProto, newName);
         count++;
       } while (methodPool.hasSeen(equivalence.wrap(newSignature)));
       return newSignature;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
index 81f68de..7f0ad04 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
@@ -160,7 +160,7 @@
       if (eligibleClass.classInitializationMayHaveSideEffects(
           appView,
           // Types that are a super type of the current context are guaranteed to be initialized.
-          type -> appView.isSubtype(method.method.holder, type).isTrue(),
+          type -> appView.isSubtype(method.holder(), type).isTrue(),
           Sets.newIdentityHashSet())) {
         return EligibilityStatus.HAS_CLINIT;
       }
@@ -170,7 +170,7 @@
     assert root.isStaticGet();
 
     StaticGet staticGet = root.asStaticGet();
-    if (staticGet.instructionMayHaveSideEffects(appView, method.method.holder)) {
+    if (staticGet.instructionMayHaveSideEffects(appView, method.holder())) {
       return EligibilityStatus.RETRIEVAL_MAY_HAVE_SIDE_EFFECTS;
     }
     DexEncodedField field = appView.appInfo().resolveField(staticGet.getField());
@@ -265,8 +265,7 @@
 
         if (user.isInvokeMethod()) {
           InvokeMethod invokeMethod = user.asInvokeMethod();
-          DexEncodedMethod singleTarget =
-              invokeMethod.lookupSingleTarget(appView, method.method.holder);
+          DexEncodedMethod singleTarget = invokeMethod.lookupSingleTarget(appView, method.holder());
           if (singleTarget == null) {
             return user; // Not eligible.
           }
@@ -507,8 +506,7 @@
             continue;
           }
 
-          DexEncodedMethod singleTarget =
-              invoke.lookupSingleTarget(appView, code.method.method.holder);
+          DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, code.method.holder());
           if (singleTarget == null || !indirectMethodCallsOnInstance.contains(singleTarget)) {
             throw new IllegalClassInlinerStateException();
           }
@@ -569,7 +567,7 @@
           continue;
         }
 
-        DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, method.method.holder);
+        DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, method.holder());
         if (singleTarget != null) {
           Predicate<InvokeMethod> noSideEffectsPredicate =
               dexItemFactory.libraryMethodsWithoutSideEffects.getOrDefault(
@@ -1156,7 +1154,7 @@
       }
 
       // Check if the method is inline-able by standard inliner.
-      DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, method.method.holder);
+      DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, method.holder());
       if (singleTarget == null) {
         return false;
       }
@@ -1190,7 +1188,7 @@
   }
 
   private boolean exemptFromInstructionLimit(DexEncodedMethod inlinee) {
-    DexType inlineeHolder = inlinee.method.holder;
+    DexType inlineeHolder = inlinee.holder();
     DexClass inlineeClass = appView.definitionFor(inlineeHolder);
     assert inlineeClass != null;
 
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 84b952b..7dcc31a 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
@@ -92,7 +92,7 @@
   public void analyzeEnums(IRCode code) {
     // Enum <clinit> and <init> are analyzed in between the two processing phases using optimization
     // feedback. Methods valueOf and values are generated by javac and are analyzed differently.
-    DexClass dexClass = appView.definitionFor(code.method.method.holder);
+    DexClass dexClass = appView.definitionFor(code.method.holder());
     if (dexClass.isEnum()
         && (code.method.isInitializer()
             || appView.dexItemFactory().enumMethods.isValueOfMethod(code.method.method, dexClass)
@@ -349,7 +349,7 @@
         return Reason.INVALID_INVOKE_ON_ARRAY;
       }
       DexEncodedMethod encodedSingleTarget =
-          invokeMethod.lookupSingleTarget(appView, code.method.method.holder);
+          invokeMethod.lookupSingleTarget(appView, code.method.holder());
       if (encodedSingleTarget == null) {
         return Reason.INVALID_INVOKE;
       }
@@ -411,7 +411,7 @@
       if (field == null) {
         return Reason.INVALID_FIELD_PUT;
       }
-      DexProgramClass dexClass = appView.definitionForProgramType(field.field.holder);
+      DexProgramClass dexClass = appView.definitionForProgramType(field.holder());
       if (dexClass == null) {
         return Reason.INVALID_FIELD_PUT;
       }
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 ba24e19..791c889 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
@@ -85,7 +85,7 @@
     TypeElement[] staticTypes = new TypeElement[size];
     if (!encodedMethod.isStatic()) {
       staticTypes[0] =
-          TypeElement.fromDexType(encodedMethod.method.holder, definitelyNotNull(), appView);
+          TypeElement.fromDexType(encodedMethod.holder(), definitelyNotNull(), appView);
     }
     for (int i = 0; i < encodedMethod.method.getArity(); i++) {
       staticTypes[i + argOffset] =
@@ -168,7 +168,7 @@
         Value aliasedValue = arg.getAliasedValue();
         if (!aliasedValue.isPhi()) {
           AbstractValue abstractValue =
-              aliasedValue.definition.getAbstractValue(appView, method.method.holder);
+              aliasedValue.definition.getAbstractValue(appView, method.holder());
           if (abstractValue.isNonTrivial()) {
             newCallSiteInfo.constants.put(i, abstractValue);
           }
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 19c897f..4889b2e 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
@@ -177,7 +177,7 @@
       return;
     }
 
-    DexClass clazz = appView.definitionFor(method.method.holder);
+    DexClass clazz = appView.definitionFor(method.holder());
     if (clazz == null) {
       return;
     }
@@ -241,8 +241,7 @@
         case INVOKE_STATIC:
           {
             InvokeStatic invoke = insn.asInvokeStatic();
-            DexEncodedMethod singleTarget =
-                invoke.lookupSingleTarget(appView, method.method.holder);
+            DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, method.holder());
             if (singleTarget == null) {
               return; // Not allowed.
             }
@@ -263,7 +262,7 @@
             DexMethod invokedMethod = invoke.getInvokedMethod();
             DexType returnType = invokedMethod.proto.returnType;
             if (returnType.isClassType()
-                && appView.appInfo().isRelatedBySubtyping(returnType, method.method.holder)) {
+                && appView.appInfo().isRelatedBySubtyping(returnType, method.holder())) {
               return; // Not allowed, could introduce an alias of the receiver.
             }
             callsReceiver.add(new Pair<>(Invoke.Type.VIRTUAL, invokedMethod));
@@ -373,7 +372,7 @@
         if (definition.isArgument()) {
           feedback.methodReturnsArgument(method, definition.asArgument().getIndex());
         }
-        DexType context = method.method.holder;
+        DexType context = method.holder();
         AbstractValue abstractReturnValue = definition.getAbstractValue(appView, context);
         if (abstractReturnValue.isNonTrivial()) {
           feedback.methodReturnsAbstractValue(method, appView, abstractReturnValue);
@@ -417,7 +416,7 @@
       return;
     }
 
-    DexClass clazz = appView.appInfo().definitionFor(method.method.holder);
+    DexClass clazz = appView.appInfo().definitionFor(method.holder());
     if (clazz == null) {
       assert false;
       return;
@@ -687,7 +686,7 @@
     if (method.isStatic()) {
       // Identifies if the method preserves class initialization after inlining.
       feedback.markTriggerClassInitBeforeAnySideEffect(
-          method, triggersClassInitializationBeforeSideEffect(method.method.holder, code, appView));
+          method, triggersClassInitializationBeforeSideEffect(method.holder(), code, appView));
     } else {
       // Identifies if the method preserves null check of the receiver after inlining.
       final Value receiver = code.getThis();
@@ -707,7 +706,7 @@
     return alwaysTriggerExpectedEffectBeforeAnythingElse(
         code,
         (instruction, it) -> {
-          DexType context = code.method.method.holder;
+          DexType context = code.method.holder();
           if (instruction.definitelyTriggersClassInitialization(
               clazz, context, appView, DIRECTLY, AnalysisAssumption.INSTRUCTION_DOES_NOT_THROW)) {
             // In order to preserve class initialization semantic, the exception must not be caught
@@ -849,7 +848,7 @@
               // We found a NPE check on the value.
               return InstructionEffect.DESIRED_EFFECT;
             }
-          } else if (instr.instructionMayHaveSideEffects(appView, code.method.method.holder)) {
+          } else if (instr.instructionMayHaveSideEffects(appView, code.method.holder())) {
             // If the current instruction is const-string, this could load the parameter name.
             // Just make sure it is indeed not throwing.
             if (instr.isConstString() && !instr.instructionInstanceCanThrow()) {
@@ -1014,7 +1013,7 @@
     if (appView.appInfo().mayHaveSideEffects.containsKey(method.method)) {
       return;
     }
-    DexType context = method.method.holder;
+    DexType context = method.holder();
     if (method.isClassInitializer()) {
       // For class initializers, we also wish to compute if the class initializer has observable
       // side effects.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningIRProvider.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningIRProvider.java
index 3a98637..608c41f 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningIRProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningIRProvider.java
@@ -38,7 +38,7 @@
       return cached;
     }
     Position position = Position.getPositionForInlining(appView, invoke, context);
-    Origin origin = appView.appInfo().originFor(method.method.holder);
+    Origin origin = appView.appInfo().originFor(method.holder());
     return method.buildInliningIR(
         context, appView, valueNumberGenerator, position, origin, methodProcessor);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporter.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporter.java
index 1ff91c0..091a5e5 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporter.java
@@ -32,8 +32,7 @@
       return;
     }
 
-    Collection<DexEncodedMethod> possibleTargets =
-        invoke.lookupTargets(appView, context.method.holder);
+    Collection<DexEncodedMethod> possibleTargets = invoke.lookupTargets(appView, context.holder());
     if (possibleTargets == null) {
       // In principle, this invoke might target any method in the program, but we do not want to
       // report a message for each of the methods in `AppInfoWithLiveness#whyAreYouNotInlining`,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporterImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporterImpl.java
index 64026ca..b141817 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporterImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporterImpl.java
@@ -220,7 +220,7 @@
         "final field `"
             + instancePut.getField()
             + "` must be initialized in a constructor of `"
-            + callee.method.holder.toSourceString()
+            + callee.holder().toSourceString()
             + "`.");
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/CodeProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/CodeProcessor.java
index 1648958..eb8b742 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/CodeProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/CodeProcessor.java
@@ -218,7 +218,7 @@
 
   private boolean shouldRewrite(DexType type) {
     // Rewrite references to lambda classes if we are outside the class.
-    return type != (context != null ? context : method).method.holder;
+    return type != (context != null ? context : method).holder();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java
index ce2394c..0bdaa57 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java
@@ -133,7 +133,7 @@
         Inliner inliner,
         DexEncodedMethod context,
         InliningIRProvider provider) {
-      DexProgramClass clazz = appView.definitionFor(method.method.holder).asProgramClass();
+      DexProgramClass clazz = appView.definitionFor(method.holder()).asProgramClass();
       assert clazz != null;
 
       LambdaGroup lambdaGroup = lambdaGroups.get(clazz);
@@ -162,7 +162,7 @@
           assert resolution.isSingleResolution();
           DexEncodedMethod singleTarget = resolution.getSingleTarget();
           assert singleTarget != null;
-          invokesToInline.put(invoke, new InliningInfo(singleTarget, singleTarget.method.holder));
+          invokesToInline.put(invoke, new InliningInfo(singleTarget, singleTarget.holder()));
         }
       }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupCodeStrategy.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupCodeStrategy.java
index 3e602b7..4d79186 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupCodeStrategy.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupCodeStrategy.java
@@ -54,7 +54,7 @@
     return field.name == context.kotlin.functional.kotlinStyleLambdaInstanceName
         && lambda == field.type
         && context.factory.isClassConstructor(context.method.method)
-        && context.method.method.holder == lambda;
+        && context.method.holder() == lambda;
   }
 
   @Override
@@ -100,10 +100,10 @@
     // Allow calls to a constructor from other classes if the lambda is singleton,
     // otherwise allow such a call only from the same class static initializer.
     boolean isSingletonLambda = group.isStateless() && group.isSingletonLambda(lambda);
-    return (isSingletonLambda == (context.method.method.holder == lambda)) &&
-        invoke.isInvokeDirect() &&
-        context.factory.isConstructor(method) &&
-        CaptureSignature.getCaptureSignature(method.proto.parameters).equals(group.id().capture);
+    return (isSingletonLambda == (context.method.holder() == lambda))
+        && invoke.isInvokeDirect()
+        && context.factory.isConstructor(method)
+        && CaptureSignature.getCaptureSignature(method.proto.parameters).equals(group.id().capture);
   }
 
   private boolean isValidVirtualCall(InvokeMethod invoke) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/BooleanMethodOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/BooleanMethodOptimizer.java
index 31444c6..16d514c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/BooleanMethodOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/BooleanMethodOptimizer.java
@@ -70,7 +70,7 @@
       InvokeMethod invoke,
       Set<Value> affectedValues) {
     Value argument = invoke.arguments().get(0);
-    AbstractValue abstractValue = argument.getAbstractValue(appView, code.method.method.holder);
+    AbstractValue abstractValue = argument.getAbstractValue(appView, code.method.holder());
     if (abstractValue.isSingleNumberValue()) {
       instructionIterator.replaceCurrentInstructionWithStaticGet(
           appView,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryMethodOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryMethodOptimizer.java
index f3d7cc6..531807e 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryMethodOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryMethodOptimizer.java
@@ -83,8 +83,7 @@
       Instruction instruction = instructionIterator.next();
       if (instruction.isInvokeMethod()) {
         InvokeMethod invoke = instruction.asInvokeMethod();
-        DexEncodedMethod singleTarget =
-            invoke.lookupSingleTarget(appView, code.method.method.holder);
+        DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, code.method.holder());
         if (singleTarget != null) {
           optimizeInvoke(code, instructionIterator, invoke, singleTarget, affectedValues);
         }
@@ -103,7 +102,7 @@
       Set<Value> affectedValues) {
     LibraryMethodModelCollection optimizer =
         libraryMethodModelCollections.getOrDefault(
-            singleTarget.method.holder, NopLibraryMethodModelCollection.getInstance());
+            singleTarget.holder(), NopLibraryMethodModelCollection.getInstance());
     optimizer.optimize(code, instructionIterator, invoke, singleTarget, affectedValues);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/StringMethodOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/StringMethodOptimizer.java
index 501a761..09c8f4e 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/StringMethodOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/StringMethodOptimizer.java
@@ -47,7 +47,7 @@
   private void optimizeEquals(
       IRCode code, InstructionListIterator instructionIterator, InvokeMethod invoke) {
     if (appView.appInfo().hasLiveness()) {
-      DexType context = code.method.method.holder;
+      DexType context = code.method.holder();
       Value first = invoke.arguments().get(0).getAliasedValue();
       Value second = invoke.arguments().get(1).getAliasedValue();
       if (isPrunedClassNameComparison(first, second, context)
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 3c99a56..9680a8e 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
@@ -78,11 +78,11 @@
     }
 
     boolean isHostClassInitializer(DexEncodedMethod method) {
-      return factory.isClassConstructor(method.method) && method.method.holder == hostType();
+      return factory.isClassConstructor(method.method) && method.holder() == hostType();
     }
 
     DexType hostType() {
-      return singletonField.field.holder;
+      return singletonField.holder();
     }
 
     DexClass hostClass() {
@@ -212,7 +212,7 @@
   public final void examineMethodCode(DexEncodedMethod method, IRCode code) {
     Set<Instruction> alreadyProcessed = Sets.newIdentityHashSet();
 
-    CandidateInfo receiverClassCandidateInfo = candidates.get(method.method.holder);
+    CandidateInfo receiverClassCandidateInfo = candidates.get(method.holder());
     Value receiverValue = code.getThis(); // NOTE: is null for static methods.
     if (receiverClassCandidateInfo != null) {
       if (receiverValue != null) {
@@ -224,13 +224,13 @@
 
         // If the candidate is still valid, ignore all instructions
         // we treat as valid usages on receiver.
-        if (candidates.get(method.method.holder) != null) {
+        if (candidates.get(method.holder()) != null) {
           alreadyProcessed.addAll(receiverValue.uniqueUsers());
         }
       } else {
         // We are inside a static method of candidate class.
         // Check if this is a valid getter of the singleton field.
-        if (method.method.proto.returnType == method.method.holder) {
+        if (method.method.proto.returnType == method.holder()) {
           List<Instruction> examined = isValidGetter(receiverClassCandidateInfo, code);
           if (examined != null) {
             DexEncodedMethod getter = receiverClassCandidateInfo.getter.get();
@@ -272,7 +272,7 @@
           // This must guarantee that removing field access will not result in missing side
           // effects, otherwise we can still staticize, but cannot remove singleton reads.
           while (iterator.hasNext()) {
-            if (!isAllowedInHostClassInitializer(method.method.holder, iterator.next(), code)) {
+            if (!isAllowedInHostClassInitializer(method.holder(), iterator.next(), code)) {
               candidateInfo.preserveRead.set(true);
               iterator.previous();
               break;
@@ -463,7 +463,7 @@
 
     if (ListUtils.lastIndexMatching(values, v -> v.getAliasedValue() == candidateValue) != 0
         || methodInvoked == null
-        || methodInvoked.method.holder != candidateType) {
+        || methodInvoked.holder() != candidateType) {
       return false;
     }
 
@@ -608,7 +608,7 @@
                   : resolutionResult.isVirtualTarget() ? resolutionResult.getSingleTarget() : null;
           if (ListUtils.lastIndexMatching(invoke.inValues(), isAliasedValue) == 0
               && methodInvoked != null
-              && methodInvoked.method.holder == candidateInfo.candidate.type) {
+              && methodInvoked.holder() == candidateInfo.candidate.type) {
             continue;
           }
         }
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 f79593b..ecdc979 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
@@ -184,7 +184,7 @@
         if (method.isStatic() || factory().isConstructor(method.method)) {
           continue;
         }
-        IRCode code = method.buildIR(appView, appView.appInfo().originFor(method.method.holder));
+        IRCode code = method.buildIR(appView, appView.appInfo().originFor(method.holder()));
         assert code != null;
         Value thisValue = code.getThis();
         assert thisValue != null;
@@ -205,7 +205,7 @@
       // CHECK: references to field read usages are fixable.
       boolean fixableFieldReads = true;
       for (DexEncodedMethod method : info.referencedFrom) {
-        IRCode code = method.buildIR(appView, appView.appInfo().originFor(method.method.holder));
+        IRCode code = method.buildIR(appView, appView.appInfo().originFor(method.holder()));
         assert code != null;
         List<StaticGet> singletonFieldReads =
             Streams.stream(code.instructionIterator())
@@ -301,7 +301,7 @@
       Collection<BiConsumer<IRCode, MethodProcessor>> codeOptimizations,
       OptimizationFeedback feedback,
       OneTimeMethodProcessor methodProcessor) {
-    Origin origin = appView.appInfo().originFor(method.method.holder);
+    Origin origin = appView.appInfo().originFor(method.holder());
     IRCode code = method.buildIR(appView, origin);
     codeOptimizations.forEach(codeOptimization -> codeOptimization.accept(code, methodProcessor));
     CodeRewriter.removeAssumeInstructions(appView, code);
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 b178579..5506792 100644
--- a/src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/FieldNameMinifier.java
@@ -273,7 +273,7 @@
       return;
     }
     assert definition.field != field;
-    assert definition.field.holder != field.holder;
+    assert definition.holder() != field.holder;
     // If the definition is renamed,
     if (renaming.containsKey(definition.field)) {
       // Assign the same, renamed name as the definition to the reference.
diff --git a/src/main/java/com/android/tools/r8/naming/FieldNamingState.java b/src/main/java/com/android/tools/r8/naming/FieldNamingState.java
index 9286684..6652d4a 100644
--- a/src/main/java/com/android/tools/r8/naming/FieldNamingState.java
+++ b/src/main/java/com/android/tools/r8/naming/FieldNamingState.java
@@ -52,7 +52,7 @@
   public DexString getOrCreateNameFor(DexField field) {
     DexEncodedField encodedField = appView.appInfo().resolveField(field);
     if (encodedField != null) {
-      DexClass clazz = appView.definitionFor(encodedField.field.holder);
+      DexClass clazz = appView.definitionFor(encodedField.holder());
       if (clazz == null) {
         return field.name;
       }
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 d5873a9..332477a 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
@@ -148,13 +148,13 @@
     }
     Value in = instruction.value();
     if (!in.isConstString()) {
-      warnUndeterminedIdentifierIfNecessary(field, method.method.holder, instruction, null);
+      warnUndeterminedIdentifierIfNecessary(field, method.holder(), instruction, null);
       return iterator;
     }
     DexString original = in.getConstInstruction().asConstString().getValue();
     DexReference itemBasedString = inferMemberOrTypeFromNameString(appView, original);
     if (itemBasedString == null) {
-      warnUndeterminedIdentifierIfNecessary(field, method.method.holder, instruction, original);
+      warnUndeterminedIdentifierIfNecessary(field, method.holder(), instruction, original);
       return iterator;
     }
     // Move the cursor back to $fieldPut
@@ -213,7 +213,7 @@
     if (isReflectionMethod(appView.dexItemFactory(), invokedMethod) || isClassNameComparison) {
       DexReference itemBasedString = identifyIdentifier(invoke, appView);
       if (itemBasedString == null) {
-        DexType context = method.method.holder;
+        DexType context = method.holder();
         warnUndeterminedIdentifierIfNecessary(invokedMethod, context, invoke, null);
         return iterator;
       }
@@ -280,14 +280,13 @@
       for (int i = 0; i < ins.size(); i++) {
         Value in = ins.get(i);
         if (!in.isConstString()) {
-          warnUndeterminedIdentifierIfNecessary(invokedMethod, method.method.holder, invoke, null);
+          warnUndeterminedIdentifierIfNecessary(invokedMethod, method.holder(), invoke, null);
           continue;
         }
         DexString original = in.getConstInstruction().asConstString().getValue();
         DexReference itemBasedString = inferMemberOrTypeFromNameString(appView, original);
         if (itemBasedString == null) {
-          warnUndeterminedIdentifierIfNecessary(
-              invokedMethod, method.method.holder, invoke, original);
+          warnUndeterminedIdentifierIfNecessary(invokedMethod, method.holder(), invoke, original);
           continue;
         }
         // Move the cursor back to $invoke
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 4d20f6b..beb3727 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -142,7 +142,7 @@
       // 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) {
-        DexClass targetClass = appView.definitionFor(target.method.holder);
+        DexClass targetClass = appView.definitionFor(target.holder());
         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 IndirectSuperInterfaceTest).
@@ -159,8 +159,8 @@
           // visibility problems when rebinding.
           final DexEncodedMethod finalTarget = target;
           Set<DexEncodedMethod> contexts = methodsWithContexts.get(method);
-          if (contexts.stream().anyMatch(context ->
-              mayNeedBridgeForVisibility(context.method.holder, finalTarget))) {
+          if (contexts.stream()
+              .anyMatch(context -> mayNeedBridgeForVisibility(context.holder(), finalTarget))) {
             target =
                 insertBridgeForVisibilityIfNeeded(
                     method, target, originalClass, targetClass, lookupTarget);
@@ -217,7 +217,7 @@
   }
 
   private boolean mayNeedBridgeForVisibility(DexType context, DexEncodedMethod method) {
-    DexType holderType = method.method.holder;
+    DexType holderType = method.holder();
     DexClass holder = appView.definitionFor(holderType);
     if (holder == null) {
       return false;
@@ -315,7 +315,7 @@
         .allMatch(
             context ->
                 isMemberVisibleFromOriginalContext(
-                    appView, context.method.holder, target.field.holder, target.accessFlags))) {
+                    appView, context.holder(), target.holder(), target.accessFlags))) {
       builder.map(
           field, lense.lookupField(validTargetFor(target.field, field, DexClass::lookupField)));
     }
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 fdd1274..bfb9fad 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -561,7 +561,7 @@
     }
     for (DexCallSite callSite : callSites) {
       for (DexEncodedMethod method : lookupLambdaImplementedMethods(callSite)) {
-        worklist.add(method.method.holder);
+        worklist.add(method.holder());
       }
     }
     while (!worklist.isEmpty()) {
@@ -855,16 +855,16 @@
     if (fieldAccessInfo == null || !fieldAccessInfo.isWritten()) {
       return false;
     }
-    DexType holder = field.field.holder;
+    DexType holder = field.holder();
     return fieldAccessInfo.isWrittenOnlyInMethodSatisfying(
-        method -> method.isInstanceInitializer() && method.method.holder == holder);
+        method -> method.isInstanceInitializer() && method.holder() == holder);
   }
 
   public boolean isStaticFieldWrittenOnlyInEnclosingStaticInitializer(DexEncodedField field) {
     assert checkIfObsolete();
     assert isFieldWritten(field) : "Expected field `" + field.toSourceString() + "` to be written";
     DexEncodedMethod staticInitializer =
-        definitionFor(field.field.holder).asProgramClass().getClassInitializer();
+        definitionFor(field.holder()).asProgramClass().getClassInitializer();
     return staticInitializer != null && isFieldOnlyWrittenInMethod(field, staticInitializer);
   }
 
@@ -876,7 +876,7 @@
   }
 
   private boolean isLibraryOrClasspathField(DexEncodedField field) {
-    DexClass holder = definitionFor(field.field.holder);
+    DexClass holder = definitionFor(field.holder());
     return holder == null || holder.isLibraryClass() || holder.isClasspathClass();
   }
 
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 20dde1b..8a9058c 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -495,7 +495,7 @@
       }
     } else if (item.isDexEncodedField()) {
       DexEncodedField dexEncodedField = item.asDexEncodedField();
-      DexProgramClass holder = getProgramClassOrNull(dexEncodedField.field.holder);
+      DexProgramClass holder = getProgramClassOrNull(dexEncodedField.holder());
       if (holder != null) {
         workList.enqueueMarkFieldKeptAction(
             holder,
@@ -504,7 +504,7 @@
       }
     } else if (item.isDexEncodedMethod()) {
       DexEncodedMethod encodedMethod = item.asDexEncodedMethod();
-      DexProgramClass holder = getProgramClassOrNull(encodedMethod.method.holder);
+      DexProgramClass holder = getProgramClassOrNull(encodedMethod.holder());
       if (holder != null) {
         workList.enqueueMarkMethodKeptAction(
             holder,
@@ -537,7 +537,7 @@
   // Utility to avoid adding to the worklist if already live.
   private boolean enqueueMarkMethodLiveAction(
       DexProgramClass clazz, DexEncodedMethod method, KeepReason reason) {
-    assert method.method.holder == clazz.type;
+    assert method.holder() == clazz.type;
     if (liveMethods.add(clazz, method, reason)) {
       workList.enqueueMarkMethodLiveAction(clazz, method, reason);
       return true;
@@ -657,7 +657,7 @@
       CfCode code = contextMethod.getCode().asCfCode();
       if (code != null) {
         LambdaClass lambdaClass =
-            lambdaRewriter.getOrCreateLambdaClass(descriptor, contextMethod.method.holder);
+            lambdaRewriter.getOrCreateLambdaClass(descriptor, contextMethod.holder());
         lambdaClasses.put(lambdaClass.type, new Pair<>(lambdaClass, contextMethod));
         lambdaCallSites
             .computeIfAbsent(contextMethod, k -> new IdentityHashMap<>())
@@ -1059,7 +1059,7 @@
       fieldAccessInfoCollection.get(encodedField.field).setReadFromMethodHandle();
     }
 
-    DexProgramClass clazz = getProgramClassOrNull(encodedField.field.holder);
+    DexProgramClass clazz = getProgramClassOrNull(encodedField.holder());
     if (clazz == null) {
       return false;
     }
@@ -1108,7 +1108,7 @@
       fieldAccessInfoCollection.get(encodedField.field).setWrittenFromMethodHandle();
     }
 
-    DexProgramClass clazz = getProgramClassOrNull(encodedField.field.holder);
+    DexProgramClass clazz = getProgramClassOrNull(encodedField.holder());
     if (clazz == null) {
       return false;
     }
@@ -1156,7 +1156,7 @@
       fieldAccessInfoCollection.get(encodedField.field).setReadFromMethodHandle();
     }
 
-    if (!isProgramClass(encodedField.field.holder)) {
+    if (!isProgramClass(encodedField.holder())) {
       // No need to trace into the non-program code.
       return false;
     }
@@ -1213,7 +1213,7 @@
       fieldAccessInfoCollection.get(encodedField.field).setWrittenFromMethodHandle();
     }
 
-    if (!isProgramClass(encodedField.field.holder)) {
+    if (!isProgramClass(encodedField.holder())) {
       // No need to trace into the non-program code.
       return false;
     }
@@ -1255,7 +1255,7 @@
     if (methodHolderClass != null && methodHolderClass.isInterface()) {
       return method;
     }
-    DexClass holderClass = appView.definitionFor(currentMethod.method.holder);
+    DexClass holderClass = appView.definitionFor(currentMethod.holder());
     if (holderClass == null || holderClass.superType == null || holderClass.isInterface()) {
       // We do not know better or this call is made from an interface.
       return method;
@@ -1717,7 +1717,7 @@
 
   private void markMethodAsTargeted(
       DexProgramClass clazz, DexEncodedMethod method, KeepReason reason) {
-    assert method.method.holder == clazz.type;
+    assert method.holder() == clazz.type;
     if (!targetedMethods.add(method, reason)) {
       // Already targeted.
       return;
@@ -1820,7 +1820,7 @@
       StringDiagnostic message =
           new StringDiagnostic(
               "Lambda expression implements missing interface `" + itf.toSourceString() + "`",
-              appInfo.originFor(context.method.holder));
+              appInfo.originFor(context.holder()));
       options.reporter.warning(message);
     } else if (!clazz.isInterface()) {
       StringDiagnostic message =
@@ -1829,7 +1829,7 @@
                   + "`"
                   + itf.toSourceString()
                   + "`",
-              appInfo.originFor(context.method.holder));
+              appInfo.originFor(context.holder()));
       options.reporter.warning(message);
     }
   }
@@ -1969,7 +1969,7 @@
           && appView.rewritePrefix.hasRewrittenTypeInSignature(method.method.proto, appView)) {
         DexMethod methodToResolve =
             DesugaredLibraryAPIConverter.methodWithVivifiedTypeInSignature(
-                method.method, method.method.holder, appView);
+                method.method, method.holder(), appView);
         assert methodToResolve != method.method;
         markLibraryOrClasspathOverrideLive(
             instantiation,
@@ -2124,7 +2124,7 @@
       DexProgramClass holder, DexEncodedField field, KeepReason reason) {
     assert field != null;
     assert field.isProgramField(appView);
-    markTypeAsLive(field.field.holder, reason);
+    markTypeAsLive(field.holder(), reason);
     markTypeAsLive(field.field.type, reason);
     if (Log.ENABLED) {
       Log.verbose(getClass(), "Adding instance field `%s` to live set.", field.field);
@@ -2141,7 +2141,7 @@
 
   private void markDirectStaticOrConstructorMethodAsLive(
       DexProgramClass clazz, DexEncodedMethod encodedMethod, KeepReason reason) {
-    assert encodedMethod.method.holder == clazz.type;
+    assert encodedMethod.holder() == clazz.type;
 
     if (!enqueueMarkMethodLiveAction(clazz, encodedMethod, reason)) {
       // Already marked live.
@@ -2196,7 +2196,7 @@
     if (info == null) {
       return false;
     }
-    DexClass clazz = appView.definitionFor(field.field.holder);
+    DexClass clazz = appView.definitionFor(field.holder());
     DexEncodedMethod defaultInitializer = clazz.getDefaultInitializer();
     return defaultInitializer != null
         ? info.isWrittenOutside(defaultInitializer)
@@ -2385,7 +2385,7 @@
     failedResolutionTargets.add(symbolicMethod);
     failedResolution.forEachFailureDependency(
         method -> {
-          DexProgramClass clazz = getProgramClassOrNull(method.method.holder);
+          DexProgramClass clazz = getProgramClassOrNull(method.holder());
           if (clazz != null) {
             failedResolutionTargets.add(method.method);
             markMethodAsTargeted(clazz, method, reason);
@@ -2430,14 +2430,14 @@
     }
     // If invoke target is invalid (inaccessible or not an instance-method) record it and stop.
     // TODO(b/146016987): We should be passing the full program context and not looking it up again.
-    DexProgramClass fromHolder = appInfo.definitionFor(from.method.holder).asProgramClass();
+    DexProgramClass fromHolder = appInfo.definitionFor(from.holder()).asProgramClass();
     DexEncodedMethod target = resolution.lookupInvokeSuperTarget(fromHolder, appInfo);
     if (target == null) {
       failedResolutionTargets.add(resolution.getResolvedMethod().method);
       return;
     }
 
-    DexProgramClass clazz = getProgramClassOrNull(target.method.holder);
+    DexProgramClass clazz = getProgramClassOrNull(target.holder());
     if (clazz == null) {
       return;
     }
@@ -2645,7 +2645,7 @@
       // Ensure accessors if needed and mark them live too.
       DexEncodedMethod accessor = lambdaClass.target.ensureAccessibilityIfNeeded(false);
       if (accessor != null) {
-        DexProgramClass clazz = getProgramClassOrNull(accessor.method.holder);
+        DexProgramClass clazz = getProgramClassOrNull(accessor.holder());
         additions.addLiveMethod(new ProgramMethod(clazz, accessor));
       }
     }
@@ -2826,7 +2826,7 @@
     // Generate first the callbacks since they may require extra wrappers.
     List<DexEncodedMethod> callbacks = desugaredLibraryWrapperAnalysis.generateCallbackMethods();
     for (DexEncodedMethod callback : callbacks) {
-      DexProgramClass clazz = getProgramClassOrNull(callback.method.holder);
+      DexProgramClass clazz = getProgramClassOrNull(callback.holder());
       additions.addLiveMethod(new ProgramMethod(clazz, callback));
     }
 
@@ -3111,7 +3111,7 @@
         } else {
           DexEncodedMethod implementation = target.getDefaultInterfaceMethodImplementation();
           if (implementation != null) {
-            DexProgramClass companion = getProgramClassOrNull(implementation.method.holder);
+            DexProgramClass companion = getProgramClassOrNull(implementation.holder());
             markTypeAsLive(companion, graphReporter.reportCompanionClass(holder, companion));
             markVirtualMethodAsLive(
                 companion,
@@ -3128,7 +3128,7 @@
 
   // Package protected due to entry point from worklist.
   void markFieldAsKept(DexProgramClass holder, DexEncodedField target, KeepReason reason) {
-    assert holder.type == target.field.holder;
+    assert holder.type == target.holder();
     if (target.accessFlags.isStatic()) {
       markStaticFieldAsLive(target, reason);
     } else {
@@ -3206,7 +3206,7 @@
   void markMethodAsLive(DexEncodedMethod method, KeepReason reason) {
     assert liveMethods.contains(method);
 
-    DexProgramClass clazz = getProgramClassOrNull(method.method.holder);
+    DexProgramClass clazz = getProgramClassOrNull(method.holder());
     if (clazz == null) {
       return;
     }
@@ -3221,7 +3221,7 @@
         if (Log.ENABLED) {
           Log.verbose(getClass(), "Found super invoke constraint on `%s`.", superCallTarget.method);
         }
-        DexProgramClass targetClass = getProgramClassOrNull(superCallTarget.method.holder);
+        DexProgramClass targetClass = getProgramClassOrNull(superCallTarget.holder());
         assert targetClass != null;
         if (targetClass != null) {
           markMethodAsTargeted(
@@ -3246,7 +3246,7 @@
 
   private void markReferencedTypesAsLive(DexEncodedMethod method) {
     markTypeAsLive(
-        method.method.holder, clazz -> graphReporter.reportClassReferencedFrom(clazz, method));
+        method.holder(), clazz -> graphReporter.reportClassReferencedFrom(clazz, method));
     markParameterAndReturnTypesAsLive(method);
   }
 
@@ -3290,7 +3290,7 @@
   }
 
   private void handleReflectiveBehavior(DexEncodedMethod method) {
-    DexType originHolder = method.method.holder;
+    DexType originHolder = method.holder();
     Origin origin = appInfo.originFor(originHolder);
     IRCode code = method.buildIR(appView, origin);
     InstructionIterator iterator = code.instructionIterator();
@@ -3578,7 +3578,7 @@
       DexType type = invoke.inValues().get(0).definition.asConstClass().getValue();
       DexProgramClass clazz = getProgramClassOrNull(type);
       if (clazz != null && clazz.accessFlags.isEnum()) {
-        DexProgramClass holder = getProgramClassOrNull(method.method.holder);
+        DexProgramClass holder = getProgramClassOrNull(method.holder());
         markEnumValuesAsReachable(clazz, KeepReason.invokedFrom(holder, method));
       }
     }
@@ -3603,7 +3603,7 @@
                       + "` is being passed to the method `"
                       + invoke.getInvokedMethod().toSourceString()
                       + "`, but was not found in `META-INF/services/`.",
-                  appInfo.originFor(method.method.holder)));
+                  appInfo.originFor(method.holder())));
         }
         return;
       }
diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
index c795bcc..2a46ba3 100644
--- a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
+++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
@@ -264,7 +264,7 @@
 
   public void enqueueMarkReachableFieldAction(
       DexProgramClass clazz, DexEncodedField field, KeepReason reason) {
-    assert field.field.holder == clazz.type;
+    assert field.holder() == clazz.type;
     queue.add(new MarkReachableFieldAction(field, reason));
   }
 
@@ -294,13 +294,13 @@
 
   void enqueueMarkMethodLiveAction(
       DexProgramClass clazz, DexEncodedMethod method, KeepReason reason) {
-    assert method.method.holder == clazz.type;
+    assert method.holder() == clazz.type;
     queue.add(new MarkMethodLiveAction(method, reason));
   }
 
   void enqueueMarkMethodKeptAction(
       DexProgramClass clazz, DexEncodedMethod method, KeepReason reason) {
-    assert method.method.holder == clazz.type;
+    assert method.holder() == clazz.type;
     queue.add(new MarkMethodKeptAction(clazz, method, reason));
   }
 
@@ -317,7 +317,7 @@
 
   public void enqueueTraceInvokeDirectAction(
       DexMethod invokedMethod, DexProgramClass currentHolder, DexEncodedMethod currentMethod) {
-    assert currentMethod.method.holder == currentHolder.type;
+    assert currentMethod.holder() == currentHolder.type;
     queue.add(new TraceInvokeDirectAction(invokedMethod, currentHolder, currentMethod));
   }
 
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 cf863de..6c52e2a 100644
--- a/src/main/java/com/android/tools/r8/shaking/GraphReporter.java
+++ b/src/main/java/com/android/tools/r8/shaking/GraphReporter.java
@@ -171,7 +171,7 @@
 
   public KeepReasonWitness reportCompatKeepDefaultInitializer(
       DexProgramClass holder, DexEncodedMethod defaultInitializer) {
-    assert holder.type == defaultInitializer.method.holder;
+    assert holder.type == defaultInitializer.holder();
     assert holder.getDefaultInitializer() == defaultInitializer;
     if (keptGraphConsumer != null) {
       reportEdge(
@@ -183,7 +183,7 @@
   }
 
   public KeepReasonWitness reportCompatKeepMethod(DexProgramClass holder, DexEncodedMethod method) {
-    assert holder.type == method.method.holder;
+    assert holder.type == method.holder();
     // TODO(b/141729349): This compat rule is from the method to itself and has not edge. Fix it.
     // The rule is stating that if the method is targeted it is live. Since such an edge does
     // not contribute to additional information in the kept graph as it stands (no distinction
@@ -234,7 +234,7 @@
   public KeepReasonWitness reportReachableClassInitializer(
       DexProgramClass clazz, DexEncodedMethod initializer) {
     if (initializer != null) {
-      assert clazz.type == initializer.method.holder;
+      assert clazz.type == initializer.holder();
       assert initializer.isClassInitializer();
       if (keptGraphConsumer != null) {
         ClassGraphNode source = getClassGraphNode(clazz.type);
@@ -284,7 +284,7 @@
 
   public KeepReasonWitness reportCompanionMethod(
       DexEncodedMethod definition, DexEncodedMethod implementation) {
-    assert InterfaceMethodRewriter.isCompanionClassType(implementation.method.holder);
+    assert InterfaceMethodRewriter.isCompanionClassType(implementation.holder());
     if (keptGraphConsumer == null) {
       return KeepReasonWitness.INSTANCE;
     }
@@ -359,7 +359,7 @@
     if (skipReporting(reason)) {
       return KeepReasonWitness.INSTANCE;
     }
-    if (reason.edgeKind() == EdgeKind.IsLibraryMethod && isNonProgramClass(method.method.holder)) {
+    if (reason.edgeKind() == EdgeKind.IsLibraryMethod && isNonProgramClass(method.holder())) {
       // Don't report edges to actual library methods.
       // TODO(b/120959039): This should be dead code once no library classes are ever enqueued.
       return KeepReasonWitness.INSTANCE;
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 c66d4a4..dd76e19 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepReason.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepReason.java
@@ -152,7 +152,7 @@
 
     private InvokedFrom(DexProgramClass holder, DexEncodedMethod method) {
       super(method);
-      assert holder.type == method.method.holder;
+      assert holder.type == method.holder();
     }
 
     @Override
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 f75a307..590ede0 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationUtils.java
@@ -57,7 +57,7 @@
   public static ProguardKeepRule buildMethodKeepRule(DexClass clazz, DexEncodedMethod method) {
     // TODO(b/122295241): These generated rules should be linked into the graph, eg, the method
     // using identified reflection should be the source keeping the target alive.
-    assert clazz.type == method.method.holder;
+    assert clazz.type == method.holder();
     ProguardKeepRule.Builder builder = ProguardKeepRule.builder();
     builder.setOrigin(proguardCompatOrigin);
     builder.setType(ProguardKeepRuleType.KEEP_CLASS_MEMBERS);
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
index 928de3a..a0576b6 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
@@ -377,7 +377,7 @@
       DexEncodedMethod target =
           appView.appInfo().resolveMethod(subType, referenceInSubType).getSingleTarget();
       // But, the resolution should not be landed on the current type we are visiting.
-      if (target == null || target.method.holder == type) {
+      if (target == null || target.holder() == type) {
         continue;
       }
       ProguardMemberRule ruleInSubType = assumeRulePool.get(target.method);
@@ -598,7 +598,7 @@
 
   private boolean canInsertForwardingMethod(DexClass holder, DexEncodedMethod target) {
     return appView.options().isGeneratingDex()
-        || ArrayUtils.contains(holder.interfaces.values, target.method.holder);
+        || ArrayUtils.contains(holder.interfaces.values, target.holder());
   }
 
   private void markMatchingOverriddenMethods(
@@ -1056,7 +1056,7 @@
         if (options.isInterfaceMethodDesugaringEnabled()
             && encodedMethod.hasCode()
             && (encodedMethod.isPrivateMethod() || encodedMethod.isStaticMember())) {
-          DexClass holder = appView.definitionFor(encodedMethod.method.holder);
+          DexClass holder = appView.definitionFor(encodedMethod.holder());
           if (holder != null && holder.isInterface()) {
             if (rule.isSpecific()) {
               options.reporter.warning(
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 7326fad..4675107 100644
--- a/src/main/java/com/android/tools/r8/shaking/ScopedDexMethodSet.java
+++ b/src/main/java/com/android/tools/r8/shaking/ScopedDexMethodSet.java
@@ -63,8 +63,8 @@
     }
     if (method.accessFlags.isMoreVisibleThan(
         existing.accessFlags,
-        method.method.holder.getPackageName(),
-        existing.method.holder.getPackageName())) {
+        method.holder().getPackageName(),
+        existing.holder().getPackageName())) {
       items.put(wrapped, method);
       return AddMethodIfMoreVisibleResult.ADDED_MORE_VISIBLE;
     }
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 92fa339..8ec0dac 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -736,7 +736,7 @@
         // Conservatively find all possible targets for this method.
         LookupResultSuccess lookupResult =
             appInfo
-                .resolveMethodOnInterface(method.method.holder, method.method)
+                .resolveMethodOnInterface(method.holder(), method.method)
                 .lookupVirtualDispatchTargets(target, appInfo)
                 .asLookupResultSuccess();
         assert lookupResult != null;
@@ -988,7 +988,7 @@
                   Rename.ALWAYS,
                   appView
                       .dexItemFactory()
-                      .prependTypeToProto(virtualMethod.method.holder, virtualMethod.method.proto));
+                      .prependTypeToProto(virtualMethod.holder(), virtualMethod.method.proto));
           makeStatic(resultingDirectMethod);
 
           // Update method pool collection now that we are adding a new public method.
@@ -1327,7 +1327,7 @@
     private DexEncodedMethod renameConstructor(
         DexEncodedMethod method, Predicate<DexMethod> availableMethodSignatures) {
       assert method.isInstanceInitializer();
-      DexType oldHolder = method.method.holder;
+      DexType oldHolder = method.holder();
 
       DexMethod newSignature;
       int count = 1;
@@ -1363,7 +1363,7 @@
       // renamed already.
       assert !method.accessFlags.isConstructor() || strategy == Rename.NEVER;
       DexString oldName = method.method.name;
-      DexType oldHolder = method.method.holder;
+      DexType oldHolder = method.holder();
 
       DexMethod newSignature;
       switch (strategy) {
@@ -1398,7 +1398,7 @@
     private DexEncodedField renameFieldIfNeeded(
         DexEncodedField field, Predicate<DexField> availableFieldSignatures) {
       DexString oldName = field.field.name;
-      DexType oldHolder = field.field.holder;
+      DexType oldHolder = field.holder();
 
       DexField newSignature =
           application.dexItemFactory.createField(target.type, field.field.type, oldName);
@@ -1647,7 +1647,7 @@
             code.computeInliningConstraint(
                 method,
                 appView,
-                new SingleTypeMapperGraphLense(method.method.holder, invocationContext),
+                new SingleTypeMapperGraphLense(method.holder(), invocationContext),
                 invocationContext);
         if (constraint == ConstraintWithTarget.NEVER) {
           return AbortReason.UNSAFE_INLINING;
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLense.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLense.java
index eded127..1013539 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLense.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLense.java
@@ -125,7 +125,7 @@
       if (virtualToDirectMethodMap != null) {
         GraphLenseLookupResult lookup = virtualToDirectMethodMap.get(previous.getMethod());
         if (lookup != null) {
-          // If the super class A of the enclosing class B (i.e., context.method.holder)
+          // If the super class A of the enclosing class B (i.e., context.holder())
           // has been merged into B during vertical class merging, and this invoke-super instruction
           // was resolving to a method in A, then the target method has been changed to a direct
           // method and moved into B, so that we need to use an invoke-direct instruction instead of
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 6bce9c1..9c18d3a 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -185,7 +185,7 @@
       if (parsedData != null || parsedKotlinSourceDebugExtensions.containsKey(holder)) {
         return parsedData;
       }
-      DexClass clazz = appView.definitionFor(currentMethod.method.holder);
+      DexClass clazz = appView.definitionFor(currentMethod.holder());
       DexValueString dexValueString = appView.getSourceDebugExtensionForType(clazz);
       if (dexValueString != null) {
         parsedData = KotlinSourceDebugExtensionParser.parse(dexValueString.value.toString());
@@ -456,7 +456,7 @@
         continue;
       }
       // We use the same name for interface names even if it has different types.
-      DexProgramClass clazz = appView.definitionForProgramType(method.method.holder);
+      DexProgramClass clazz = appView.definitionForProgramType(method.holder());
       DexClassAndMethod lookupResult =
           appView.appInfo().lookupMaximallySpecificMethod(clazz, method.method);
       if (lookupResult == null) {
@@ -783,7 +783,7 @@
     }
     method.setCode(
         new CfCode(
-            method.method.holder,
+            method.holder(),
             oldCode.getMaxStack(),
             oldCode.getMaxLocals(),
             newInstructions,
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 862bb79..2ffc39e 100644
--- a/src/test/java/com/android/tools/r8/cfmethodgeneration/MethodGenerationBase.java
+++ b/src/test/java/com/android/tools/r8/cfmethodgeneration/MethodGenerationBase.java
@@ -102,8 +102,7 @@
                 if (method.isInitializer()) {
                   continue;
                 }
-                String methodName =
-                    method.method.holder.getName() + "_" + method.method.name.toString();
+                String methodName = method.holder().getName() + "_" + method.method.name.toString();
                 codePrinter.visitMethod(methodName, method.getCode().asCfCode());
               }
             });
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 07db6bd..2438ab2 100644
--- a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
@@ -83,12 +83,9 @@
     DexEncodedMethod method = getMethod(inspector, DEFAULT_CLASS_NAME, "int", "x",
         ImmutableList.of());
     assertFalse(
-        appInfo
-            .resolveMethod(method.method.holder, method.method)
-            .getSingleTarget()
-            .isVirtualMethod());
-    assertNull(appInfo.lookupDirectTarget(method.method, method.method.holder));
-    assertNotNull(appInfo.lookupStaticTarget(method.method, method.method.holder));
+        appInfo.resolveMethod(method.holder(), method.method).getSingleTarget().isVirtualMethod());
+    assertNull(appInfo.lookupDirectTarget(method.method, method.holder()));
+    assertNotNull(appInfo.lookupStaticTarget(method.method, method.holder()));
 
     if (ToolHelper.getDexVm().getVersion().isOlderThanOrEqual(DexVm.Version.V4_4_4)) {
       // Dalvik rejects at verification time instead of producing the
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 741be70..20ed6dc 100644
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
+++ b/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
@@ -94,7 +94,7 @@
             .asLookupResultSuccess();
     assertNotNull(lookupResult);
     assertFalse(lookupResult.hasLambdaTargets());
-    if (appInfo().subtypes(method.method.holder).stream()
+    if (appInfo().subtypes(method.holder()).stream()
         .allMatch(t -> appInfo().definitionFor(t).isInterface())) {
       Counter counter = new Counter();
       lookupResult.forEach(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/HashCodeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/HashCodeTest.java
index 2a2ad92..b5997bf 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/HashCodeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/HashCodeTest.java
@@ -43,8 +43,8 @@
 
   private void callSiteOptimizationInfoInspect(DexEncodedMethod encodedMethod) {
     // TODO(b/139246447): should avoid visiting A#<init>, which is trivial, default init!
-    assert encodedMethod.method.holder.toSourceString().endsWith("A")
-        && encodedMethod.toSourceString().contains("<init>")
+    assert encodedMethod.holder().toSourceString().endsWith("A")
+            && encodedMethod.toSourceString().contains("<init>")
         : "Unexpected revisit: " + encodedMethod.toSourceString();
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeInterfaceWithRefinedReceiverTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeInterfaceWithRefinedReceiverTest.java
index 4890c6a..54a3b8e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeInterfaceWithRefinedReceiverTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeInterfaceWithRefinedReceiverTest.java
@@ -64,7 +64,7 @@
     assert encodedMethod.method.name.toString().equals("m")
         : "Unexpected revisit: " + encodedMethod.toSourceString();
     CallSiteOptimizationInfo callSiteOptimizationInfo = encodedMethod.getCallSiteOptimizationInfo();
-    if (encodedMethod.method.holder.toSourceString().endsWith("$C")) {
+    if (encodedMethod.holder().toSourceString().endsWith("$C")) {
       assert callSiteOptimizationInfo.getDynamicUpperBoundType(1).isDefinitelyNotNull();
     } else {
       assert callSiteOptimizationInfo.getDynamicUpperBoundType(1).isDefinitelyNull();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeVirtualWithRefinedReceiverTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeVirtualWithRefinedReceiverTest.java
index a0a436d..96b85ec 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeVirtualWithRefinedReceiverTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeVirtualWithRefinedReceiverTest.java
@@ -61,7 +61,7 @@
     assert encodedMethod.method.name.toString().equals("m")
         : "Unexpected revisit: " + encodedMethod.toSourceString();
     CallSiteOptimizationInfo callSiteOptimizationInfo = encodedMethod.getCallSiteOptimizationInfo();
-    if (encodedMethod.method.holder.toSourceString().endsWith("$C")) {
+    if (encodedMethod.holder().toSourceString().endsWith("$C")) {
       assert callSiteOptimizationInfo.getDynamicUpperBoundType(1).isDefinitelyNotNull();
     } else {
       assert callSiteOptimizationInfo.getDynamicUpperBoundType(1).isDefinitelyNull();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeVirtualPositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeVirtualPositiveTest.java
index ab5d763..14ff937 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeVirtualPositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeVirtualPositiveTest.java
@@ -65,7 +65,7 @@
     CallSiteOptimizationInfo callSiteOptimizationInfo = encodedMethod.getCallSiteOptimizationInfo();
     assert callSiteOptimizationInfo.getDynamicUpperBoundType(1).isDefinitelyNotNull();
     AbstractValue abstractValue = callSiteOptimizationInfo.getAbstractArgumentValue(1);
-    if (encodedMethod.method.holder.toSourceString().endsWith("$A")) {
+    if (encodedMethod.holder().toSourceString().endsWith("$A")) {
       assert abstractValue.isSingleStringValue()
           && abstractValue.asSingleStringValue().getDexString().toString().equals("nul");
     } else {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeInterfacePositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeInterfacePositiveTest.java
index 8cc1e12..204f41b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeInterfacePositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeInterfacePositiveTest.java
@@ -66,7 +66,7 @@
     CallSiteOptimizationInfo callSiteOptimizationInfo = encodedMethod.getCallSiteOptimizationInfo();
     TypeElement upperBoundType = callSiteOptimizationInfo.getDynamicUpperBoundType(1);
     assert upperBoundType.isDefinitelyNotNull();
-    if (encodedMethod.method.holder.toSourceString().endsWith("$A")) {
+    if (encodedMethod.holder().toSourceString().endsWith("$A")) {
       assert upperBoundType.isClassType()
           && upperBoundType.asClassType().getClassType().toSourceString().endsWith("$Sub1");
     } else {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualNegativeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualNegativeTest.java
index ad7b3ae..4882c32 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualNegativeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualNegativeTest.java
@@ -66,7 +66,7 @@
       TypeElement upperBoundType = callSiteOptimizationInfo.getDynamicUpperBoundType(1);
       assert upperBoundType.isNullable();
       assert upperBoundType.isClassType()
-          && upperBoundType.asClassType().getClassType().equals(encodedMethod.method.holder);
+          && upperBoundType.asClassType().getClassType().equals(encodedMethod.holder());
     } else {
       assert methodName.equals("test");
       assert callSiteOptimizationInfo.getDynamicUpperBoundType(0).isDefinitelyNotNull();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualPositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualPositiveTest.java
index 0551286..0009024 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualPositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualPositiveTest.java
@@ -64,10 +64,10 @@
     TypeElement upperBoundType = callSiteOptimizationInfo.getDynamicUpperBoundType(1);
     assert upperBoundType.isClassType()
         && upperBoundType.asClassType().getClassType().toSourceString().endsWith("$A");
-    if (encodedMethod.method.holder.toSourceString().endsWith("$A")) {
+    if (encodedMethod.holder().toSourceString().endsWith("$A")) {
       assert upperBoundType.isDefinitelyNotNull();
     } else {
-      assert encodedMethod.method.holder.toSourceString().endsWith("$B");
+      assert encodedMethod.holder().toSourceString().endsWith("$B");
       assert upperBoundType.isNullable();
     }
   }
diff --git a/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java b/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
index 0d89583..7bd9cc9 100644
--- a/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/SingleTargetLookupTest.java
@@ -186,8 +186,7 @@
       Assert.assertNull(singleVirtualTarget);
     } else {
       Assert.assertNotNull(singleVirtualTarget);
-      Assert.assertEquals(
-          toType(singleTargetHolderOrNull, appInfo), singleVirtualTarget.method.holder);
+      Assert.assertEquals(toType(singleTargetHolderOrNull, appInfo), singleVirtualTarget.holder());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessTest.java
index a9dc70f..18cbb66 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessTest.java
@@ -133,7 +133,7 @@
     DexEncodedMethod targetSuper =
         resolutionResult.lookupInvokeSuperTarget(callerClassDefinition, appInfo);
     if (inSameNest) {
-      assertEquals(definingClassDefinition.type, targetSpecial.method.holder);
+      assertEquals(definingClassDefinition.type, targetSpecial.holder());
       assertEquals(targetSpecial, targetSuper);
     } else {
       assertNull(targetSpecial);
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessTest.java
index 490b7dc..58575d8 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessTest.java
@@ -109,7 +109,7 @@
     DexEncodedMethod targetSuper =
         resolutionResult.lookupInvokeSuperTarget(callerClassDefinition, appInfo);
     if (inSameNest) {
-      assertEquals(definingClassDefinition.type, targetSpecial.method.holder);
+      assertEquals(definingClassDefinition.type, targetSpecial.holder());
       assertEquals(targetSpecial, targetSuper);
     } else {
       assertNull(targetSpecial);
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessWithIntermediateTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessWithIntermediateTest.java
index 8e21be0..79e8f76 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessWithIntermediateTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessWithIntermediateTest.java
@@ -142,7 +142,7 @@
     DexEncodedMethod targetSuper =
         resolutionResult.lookupInvokeSuperTarget(callerClassDefinition, appInfo);
     if (inSameNest && symbolicReferenceIsDefiningType) {
-      assertEquals(definingClassDefinition.type, targetSpecial.method.holder);
+      assertEquals(definingClassDefinition.type, targetSpecial.holder());
       assertEquals(targetSpecial, targetSuper);
     } else {
       assertNull(targetSpecial);
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodPublicAccessWithIntermediateTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodPublicAccessWithIntermediateTest.java
index 49426c4..db75b6e 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodPublicAccessWithIntermediateTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodPublicAccessWithIntermediateTest.java
@@ -108,7 +108,7 @@
     // Verify that looking up the dispatch target returns the defining method.
     DexEncodedMethod targetSpecial =
         resolutionResult.lookupInvokeSpecialTarget(callerClassDefinition, appInfo);
-    assertEquals(definingClassDefinition.type, targetSpecial.method.holder);
+    assertEquals(definingClassDefinition.type, targetSpecial.holder());
 
     DexEncodedMethod targetSuper =
         resolutionResult.lookupInvokeSuperTarget(callerClassDefinition, appInfo);
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/AbstractAllTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/AbstractAllTest.java
index 005f292..b6023ce 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/AbstractAllTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/AbstractAllTest.java
@@ -48,7 +48,7 @@
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
     // Currently R8 will resolve to L::f as that is the first in the topological search.
     // Resolution may return any of the matches, so it is valid if this expectation changes.
-    assertEquals(L.class.getTypeName(), resolutionTarget.method.holder.toSourceString());
+    assertEquals(L.class.getTypeName(), resolutionTarget.holder().toSourceString());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultLeftAbstractRightTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultLeftAbstractRightTest.java
index 0c3ed4c..2068ef1 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultLeftAbstractRightTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultLeftAbstractRightTest.java
@@ -51,7 +51,7 @@
     DexMethod method = buildNullaryVoidMethod(B.class, "f", appInfo.dexItemFactory());
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
-    assertEquals(L.class.getTypeName(), resolutionTarget.method.holder.toSourceString());
+    assertEquals(L.class.getTypeName(), resolutionTarget.holder().toSourceString());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultRightAbstractLeftTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultRightAbstractLeftTest.java
index 42f7600..64908c4 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultRightAbstractLeftTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultRightAbstractLeftTest.java
@@ -51,7 +51,7 @@
     DexMethod method = buildNullaryVoidMethod(B.class, "f", appInfo.dexItemFactory());
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
-    assertEquals(R.class.getTypeName(), resolutionTarget.method.holder.toSourceString());
+    assertEquals(R.class.getTypeName(), resolutionTarget.holder().toSourceString());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractLeftTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractLeftTest.java
index c29509d..4841f77 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractLeftTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractLeftTest.java
@@ -54,7 +54,7 @@
     DexMethod method = buildNullaryVoidMethod(B.class, "f", appInfo.dexItemFactory());
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
-    assertEquals(L.class.getTypeName(), resolutionTarget.method.holder.toSourceString());
+    assertEquals(L.class.getTypeName(), resolutionTarget.holder().toSourceString());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractRightTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractRightTest.java
index e7c5ab8..6059ea1 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractRightTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAbstractRightTest.java
@@ -54,7 +54,7 @@
     DexMethod method = buildNullaryVoidMethod(B.class, "f", appInfo.dexItemFactory());
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
-    assertEquals(R.class.getTypeName(), resolutionTarget.method.holder.toSourceString());
+    assertEquals(R.class.getTypeName(), resolutionTarget.holder().toSourceString());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndBothTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndBothTest.java
index 3d7071d..433575f 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndBothTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndBothTest.java
@@ -55,8 +55,7 @@
     Set<String> holders = new HashSet<>();
     resolutionResult
         .asFailedResolution()
-        .forEachFailureDependency(
-            target -> holders.add(target.method.holder.toSourceString()));
+        .forEachFailureDependency(target -> holders.add(target.holder().toSourceString()));
     assertEquals(ImmutableSet.of(L.class.getTypeName(), R.class.getTypeName()), holders);
   }
 
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndLeftTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndLeftTest.java
index b5c2018..e04908b 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndLeftTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndLeftTest.java
@@ -45,7 +45,7 @@
     DexMethod method = buildNullaryVoidMethod(B.class, "f", appInfo.dexItemFactory());
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
-    assertEquals(L.class.getTypeName(), resolutionTarget.method.holder.toSourceString());
+    assertEquals(L.class.getTypeName(), resolutionTarget.holder().toSourceString());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndRightTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndRightTest.java
index 867cfe9..7472e89 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndRightTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/DefaultTopAndRightTest.java
@@ -45,7 +45,7 @@
     DexMethod method = buildNullaryVoidMethod(B.class, "f", appInfo.dexItemFactory());
     ResolutionResult resolutionResult = appInfo.resolveMethod(method.holder, method);
     DexEncodedMethod resolutionTarget = resolutionResult.getSingleTarget();
-    assertEquals(R.class.getTypeName(), resolutionTarget.method.holder.toSourceString());
+    assertEquals(R.class.getTypeName(), resolutionTarget.holder().toSourceString());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/TwoDefaultMethodsWithoutTopTest.java b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/TwoDefaultMethodsWithoutTopTest.java
index b2a4ce2..5966b9d 100644
--- a/src/test/java/com/android/tools/r8/resolution/interfacediamonds/TwoDefaultMethodsWithoutTopTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/interfacediamonds/TwoDefaultMethodsWithoutTopTest.java
@@ -56,8 +56,7 @@
     Set<String> holders = new HashSet<>();
     resolutionResult
         .asFailedResolution()
-        .forEachFailureDependency(
-            m -> holders.add(m.method.holder.toSourceString()));
+        .forEachFailureDependency(m -> holders.add(m.holder().toSourceString()));
     assertEquals(ImmutableSet.of(I.class.getTypeName(), J.class.getTypeName()), holders);
   }