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 c12f3f4..670344c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -250,6 +250,14 @@
     assert parameterAnnotationsList != null;
   }
 
+  public DexType getHolderType() {
+    return getReference().holder;
+  }
+
+  public DexString getName() {
+    return getReference().name;
+  }
+
   public DexMethod getReference() {
     return method;
   }
diff --git a/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java b/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
index bbefa18..060f171 100644
--- a/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/InterfaceMethodNameMinifier.java
@@ -20,6 +20,7 @@
 import com.google.common.base.Equivalence;
 import com.google.common.base.Equivalence.Wrapper;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -110,16 +111,13 @@
       this.iface = iface;
     }
 
-    DexString getReservedName(DexMethod method) {
+    DexString getReservedName(DexEncodedMethod method) {
       // If an interface is kept and we are using applymapping, the renamed name for this method
       // is tracked on this level.
       if (appView.options().getProguardConfiguration().hasApplyMappingFile()) {
-        DexEncodedMethod encodedMethod = appView.definitionFor(method);
-        if (encodedMethod != null) {
-          DexString reservedName = minifierState.getReservedName(encodedMethod, iface);
-          if (reservedName != null) {
-            return reservedName;
-          }
+        DexString reservedName = minifierState.getReservedName(method, iface);
+        if (reservedName != null) {
+          return reservedName;
         }
       }
       // Otherwise, we just search the hierarchy for the first identity reservation since
@@ -131,18 +129,18 @@
                   Set<DexString> reservedNamesFor =
                       minifierState
                           .getReservationState(reservationType)
-                          .getReservedNamesFor(method);
+                          .getReservedNamesFor(method.getReference());
                   assert reservedNamesFor == null || !reservedNamesFor.isEmpty();
-                  if (reservedNamesFor != null && reservedNamesFor.contains(method.name)) {
+                  if (reservedNamesFor != null && reservedNamesFor.contains(method.getName())) {
                     return true;
                   }
                 }
                 return null;
               });
-      return isReserved == null ? null : method.name;
+      return isReserved == null ? null : method.getName();
     }
 
-    void reserveName(DexString reservedName, DexMethod method) {
+    void reserveName(DexString reservedName, DexEncodedMethod method) {
       forAll(
           s -> {
             s.reservationTypes.forEach(
@@ -153,13 +151,13 @@
           });
     }
 
-    boolean isAvailable(DexString candidate, DexMethod method) {
+    boolean isAvailable(DexString candidate, DexEncodedMethod method) {
       Boolean result =
           forAny(
               s -> {
                 for (DexType resType : s.reservationTypes) {
                   MethodNamingState<?> state = minifierState.getNamingState(resType);
-                  if (!state.isAvailable(candidate, method)) {
+                  if (!state.isAvailable(candidate, method.getReference())) {
                     return false;
                   }
                 }
@@ -168,15 +166,11 @@
       return result == null ? true : result;
     }
 
-    void addRenaming(DexString newName, DexMethod method) {
+    void addRenaming(DexString newName, DexEncodedMethod method) {
       forAll(
-          s -> {
-            s.reservationTypes.forEach(
-                resType -> {
-                  MethodNamingState<?> state = minifierState.getNamingState(resType);
-                  state.addRenaming(newName, method);
-                });
-          });
+          s ->
+              s.reservationTypes.forEach(
+                  resType -> minifierState.getNamingState(resType).addRenaming(newName, method)));
     }
 
     <T> void forAll(Consumer<InterfaceReservationState> action) {
@@ -241,17 +235,18 @@
   class InterfaceMethodGroupState implements Comparable<InterfaceMethodGroupState> {
 
     private final Set<DexCallSite> callSites = new HashSet<>();
-    private final Map<DexMethod, Set<InterfaceReservationState>> methodStates = new HashMap<>();
-    private final List<DexMethod> callSiteCollidingMethods = new ArrayList<>();
+    private final Map<DexEncodedMethod, Set<InterfaceReservationState>> methodStates =
+        new HashMap<>();
+    private final List<DexEncodedMethod> callSiteCollidingMethods = new ArrayList<>();
 
-    void addState(DexMethod method, InterfaceReservationState interfaceState) {
+    void addState(DexEncodedMethod method, InterfaceReservationState interfaceState) {
       methodStates.computeIfAbsent(method, m -> new HashSet<>()).add(interfaceState);
     }
 
     void appendMethodGroupState(InterfaceMethodGroupState state) {
       callSites.addAll(state.callSites);
       callSiteCollidingMethods.addAll(state.callSiteCollidingMethods);
-      for (DexMethod key : state.methodStates.keySet()) {
+      for (DexEncodedMethod key : state.methodStates.keySet()) {
         methodStates.computeIfAbsent(key, k -> new HashSet<>()).addAll(state.methodStates.get(key));
       }
     }
@@ -269,14 +264,14 @@
       // It is perfectly fine to have multiple reserved names inside a group. If we have an identity
       // reservation, we have to prioritize that over the others, otherwise we just propose the
       // first ordered reserved name since we do not allow overwriting the name.
-      List<DexMethod> sortedMethods = Lists.newArrayList(methodStates.keySet());
-      sortedMethods.sort(DexMethod::slowCompareTo);
+      List<DexEncodedMethod> sortedMethods = Lists.newArrayList(methodStates.keySet());
+      sortedMethods.sort((x, y) -> x.getReference().slowCompareTo(y.getReference()));
       DexString reservedName = null;
-      for (DexMethod method : sortedMethods) {
+      for (DexEncodedMethod method : sortedMethods) {
         for (InterfaceReservationState state : methodStates.get(method)) {
           DexString stateReserved = state.getReservedName(method);
-          if (stateReserved == method.name) {
-            return method.name;
+          if (stateReserved == method.getName()) {
+            return method.getName();
           } else if (stateReserved != null) {
             reservedName = stateReserved;
           }
@@ -321,7 +316,7 @@
           });
     }
 
-    void forEachState(BiConsumer<DexMethod, InterfaceReservationState> action) {
+    void forEachState(BiConsumer<DexEncodedMethod, InterfaceReservationState> action) {
       forAnyState(
           (s, i) -> {
             action.accept(s, i);
@@ -329,9 +324,10 @@
           });
     }
 
-    <T> T forAnyState(BiFunction<DexMethod, InterfaceReservationState, T> callback) {
+    <T> T forAnyState(BiFunction<DexEncodedMethod, InterfaceReservationState, T> callback) {
       T returnValue;
-      for (Map.Entry<DexMethod, Set<InterfaceReservationState>> entry : methodStates.entrySet()) {
+      for (Map.Entry<DexEncodedMethod, Set<InterfaceReservationState>> entry :
+          methodStates.entrySet()) {
         for (InterfaceReservationState state : entry.getValue()) {
           returnValue = callback.apply(entry.getKey(), state);
           if (returnValue != null) {
@@ -342,7 +338,7 @@
       return null;
     }
 
-    boolean containsReservation(DexMethod method, DexType reservationType) {
+    boolean containsReservation(DexEncodedMethod method, DexType reservationType) {
       Set<InterfaceReservationState> states = methodStates.get(method);
       if (states != null) {
         for (InterfaceReservationState state : states) {
@@ -363,12 +359,14 @@
 
   private final AppView<AppInfoWithLiveness> appView;
   private final Equivalence<DexMethod> equivalence;
+  private final Equivalence<DexEncodedMethod> definitionEquivalence;
   private final MethodNameMinifier.State minifierState;
 
   private final Map<DexCallSite, DexString> callSiteRenamings = new IdentityHashMap<>();
 
   /** A map from DexMethods to all the states linked to interfaces they appear in. */
-  private final Map<Wrapper<DexMethod>, InterfaceMethodGroupState> globalStateMap = new HashMap<>();
+  private final Map<Wrapper<DexEncodedMethod>, InterfaceMethodGroupState> globalStateMap =
+      new HashMap<>();
 
   /** A map for caching all interface states. */
   private final Map<DexType, InterfaceReservationState> interfaceStateMap = new HashMap<>();
@@ -380,9 +378,21 @@
         appView.options().getProguardConfiguration().isOverloadAggressively()
             ? MethodSignatureEquivalence.get()
             : MethodJavaSignatureEquivalence.get();
+    this.definitionEquivalence =
+        new Equivalence<DexEncodedMethod>() {
+          @Override
+          protected boolean doEquivalent(DexEncodedMethod method, DexEncodedMethod other) {
+            return equivalence.equivalent(method.getReference(), other.getReference());
+          }
+
+          @Override
+          protected int doHash(DexEncodedMethod method) {
+            return equivalence.hash(method.getReference());
+          }
+        };
   }
 
-  private Comparator<Wrapper<DexMethod>> getDefaultInterfaceMethodOrdering() {
+  private Comparator<Wrapper<DexEncodedMethod>> getDefaultInterfaceMethodOrdering() {
     return Comparator.comparing(globalStateMap::get);
   }
 
@@ -419,10 +429,10 @@
       InterfaceReservationState inheritanceState = interfaceStateMap.get(iface.type);
       assert inheritanceState != null;
       for (DexEncodedMethod method : iface.methods()) {
-        Wrapper<DexMethod> key = equivalence.wrap(method.method);
+        Wrapper<DexEncodedMethod> key = definitionEquivalence.wrap(method);
         globalStateMap
             .computeIfAbsent(key, k -> new InterfaceMethodGroupState())
-            .addState(method.method, inheritanceState);
+            .addState(method, inheritanceState);
       }
     }
     timing.end();
@@ -439,11 +449,11 @@
     // Note that if the input does not use multi-interface lambdas unificationParent will remain
     // empty.
     timing.begin("Union-find");
-    DisjointSets<Wrapper<DexMethod>> unification = new DisjointSets<>();
+    DisjointSets<Wrapper<DexEncodedMethod>> unification = new DisjointSets<>();
 
     liveCallSites.forEach(
         callSite -> {
-          Set<Wrapper<DexMethod>> callSiteMethods = new HashSet<>();
+          Set<Wrapper<DexEncodedMethod>> callSiteMethods = new HashSet<>();
           // Don't report errors, as the set of call sites is a conservative estimate, and can
           // refer to interfaces which has been removed.
           Set<DexEncodedMethod> implementedMethods =
@@ -452,7 +462,7 @@
             return;
           }
           for (DexEncodedMethod method : implementedMethods) {
-            Wrapper<DexMethod> wrapped = equivalence.wrap(method.method);
+            Wrapper<DexEncodedMethod> wrapped = definitionEquivalence.wrap(method);
             InterfaceMethodGroupState groupState = globalStateMap.get(wrapped);
             assert groupState != null : wrapped;
             groupState.addCallSite(callSite);
@@ -474,16 +484,15 @@
               assert iface.isInterface();
               for (DexEncodedMethod implementedMethod : implementedMethods) {
                 for (DexEncodedMethod virtualMethod : iface.virtualMethods()) {
-                  boolean differentName =
-                      !implementedMethod.method.name.equals(virtualMethod.method.name);
+                  boolean differentName = implementedMethod.getName() != virtualMethod.getName();
                   if (differentName
                       && MethodJavaSignatureEquivalence.getEquivalenceIgnoreName()
                           .equivalent(implementedMethod.method, virtualMethod.method)) {
                     InterfaceMethodGroupState interfaceMethodGroupState =
                         globalStateMap.computeIfAbsent(
-                            equivalence.wrap(implementedMethod.method),
+                            definitionEquivalence.wrap(implementedMethod),
                             k -> new InterfaceMethodGroupState());
-                    interfaceMethodGroupState.callSiteCollidingMethods.add(virtualMethod.method);
+                    interfaceMethodGroupState.callSiteCollidingMethods.add(virtualMethod);
                   }
                 }
               }
@@ -491,9 +500,9 @@
           }
           if (callSiteMethods.size() > 1) {
             // Implemented interfaces have different protos. Unify them.
-            Wrapper<DexMethod> mainKey = callSiteMethods.iterator().next();
-            Wrapper<DexMethod> representative = unification.findOrMakeSet(mainKey);
-            for (Wrapper<DexMethod> key : callSiteMethods) {
+            Wrapper<DexEncodedMethod> mainKey = callSiteMethods.iterator().next();
+            Wrapper<DexEncodedMethod> representative = unification.findOrMakeSet(mainKey);
+            for (Wrapper<DexEncodedMethod> key : callSiteMethods) {
               unification.unionWithMakeSet(representative, key);
             }
           }
@@ -504,14 +513,15 @@
     // We now have roots for all unions. Add all of the states for the groups to the method state
     // for the unions to allow consistent naming across different protos.
     timing.begin("States for union");
-    Map<Wrapper<DexMethod>, Set<Wrapper<DexMethod>>> unions = unification.collectSets();
+    Map<Wrapper<DexEncodedMethod>, Set<Wrapper<DexEncodedMethod>>> unions =
+        unification.collectSets();
 
-    for (Wrapper<DexMethod> wrapped : unions.keySet()) {
+    for (Wrapper<DexEncodedMethod> wrapped : unions.keySet()) {
       InterfaceMethodGroupState groupState = globalStateMap.get(wrapped);
       assert groupState != null;
 
-      for (Wrapper<DexMethod> groupedMethod : unions.get(wrapped)) {
-        DexMethod method = groupedMethod.get();
+      for (Wrapper<DexEncodedMethod> groupedMethod : unions.get(wrapped)) {
+        DexEncodedMethod method = groupedMethod.get();
         assert method != null;
         groupState.appendMethodGroupState(globalStateMap.get(groupedMethod));
       }
@@ -522,7 +532,7 @@
     // Filter out the groups that is included both in the unification and in the map. We sort the
     // methods by the number of dependent states, so that we use short names for method that are
     // referenced in many places.
-    List<Wrapper<DexMethod>> interfaceMethodGroups =
+    List<Wrapper<DexEncodedMethod>> interfaceMethodGroups =
         globalStateMap.keySet().stream()
             .filter(unification::isRepresentativeOrNotPresent)
             .sorted(
@@ -540,8 +550,8 @@
     timing.begin("Reserve in groups");
     // It is important that this entire phase is run before given new names, to ensure all
     // reservations are propagated to all naming states.
-    List<Wrapper<DexMethod>> nonReservedMethodGroups = new ArrayList<>();
-    for (Wrapper<DexMethod> interfaceMethodGroup : interfaceMethodGroups) {
+    List<Wrapper<DexEncodedMethod>> nonReservedMethodGroups = new ArrayList<>();
+    for (Wrapper<DexEncodedMethod> interfaceMethodGroup : interfaceMethodGroups) {
       InterfaceMethodGroupState groupState = globalStateMap.get(interfaceMethodGroup);
       assert groupState != null;
       DexString reservedName = groupState.getReservedName();
@@ -559,7 +569,7 @@
     timing.end();
 
     timing.begin("Rename in groups");
-    for (Wrapper<DexMethod> interfaceMethodGroup : nonReservedMethodGroups) {
+    for (Wrapper<DexEncodedMethod> interfaceMethodGroup : nonReservedMethodGroups) {
       InterfaceMethodGroupState groupState = globalStateMap.get(interfaceMethodGroup);
       assert groupState != null;
       assert groupState.getReservedName() == null;
@@ -567,11 +577,11 @@
       assert newName != null;
       Set<String> loggingFilter = appView.options().extensiveInterfaceMethodMinifierLoggingFilter;
       if (!loggingFilter.isEmpty()) {
-        Set<DexMethod> sourceMethods = groupState.methodStates.keySet();
+        Set<DexEncodedMethod> sourceMethods = groupState.methodStates.keySet();
         if (sourceMethods.stream()
-            .map(DexMethod::toSourceString)
+            .map(DexEncodedMethod::toSourceString)
             .anyMatch(loggingFilter::contains)) {
-          print(interfaceMethodGroup.get(), sourceMethods, System.out);
+          print(interfaceMethodGroup.get().getReference(), sourceMethods, System.out);
         }
       }
       for (DexCallSite callSite : groupState.callSites) {
@@ -582,20 +592,20 @@
 
     // After all naming is completed for callsites, we must ensure to rename all interface methods
     // that can collide with the callsite method name.
-    for (Wrapper<DexMethod> interfaceMethodGroup : nonReservedMethodGroups) {
+    for (Wrapper<DexEncodedMethod> interfaceMethodGroup : nonReservedMethodGroups) {
       InterfaceMethodGroupState groupState = globalStateMap.get(interfaceMethodGroup);
       if (groupState.callSiteCollidingMethods.isEmpty()) {
         continue;
       }
-      DexMethod key = interfaceMethodGroup.get();
-      MethodNamingState<?> keyNamingState = minifierState.getNamingState(key.holder);
+      DexEncodedMethod key = interfaceMethodGroup.get();
+      MethodNamingState<?> keyNamingState = minifierState.getNamingState(key.getHolderType());
       DexString existingRenaming = keyNamingState.newOrReservedNameFor(key);
       assert existingRenaming != null;
-      for (DexMethod collidingMethod : groupState.callSiteCollidingMethods) {
+      for (DexEncodedMethod collidingMethod : groupState.callSiteCollidingMethods) {
         DexString newNameInGroup = newNameInGroup(collidingMethod, keyNamingState, groupState);
         minifierState.putRenaming(collidingMethod, newNameInGroup);
         MethodNamingState<?> methodNamingState =
-            minifierState.getNamingState(collidingMethod.holder);
+            minifierState.getNamingState(collidingMethod.getReference().holder);
         methodNamingState.addRenaming(newNameInGroup, collidingMethod);
         keyNamingState.addRenaming(newNameInGroup, collidingMethod);
       }
@@ -605,11 +615,11 @@
     timing.end(); // end compute timing
   }
 
-  private DexString assignNewName(DexMethod method, InterfaceMethodGroupState groupState) {
+  private DexString assignNewName(DexEncodedMethod method, InterfaceMethodGroupState groupState) {
     assert groupState.getReservedName() == null;
     assert groupState.methodStates.containsKey(method);
-    assert groupState.containsReservation(method, method.holder);
-    MethodNamingState<?> namingState = minifierState.getNamingState(method.holder);
+    assert groupState.containsReservation(method, method.getHolderType());
+    MethodNamingState<?> namingState = minifierState.getNamingState(method.getHolderType());
     // Check if the name is available in all states.
     DexString newName =
         namingState.newOrReservedNameFor(
@@ -619,7 +629,9 @@
   }
 
   private DexString newNameInGroup(
-      DexMethod method, MethodNamingState<?> namingState, InterfaceMethodGroupState groupState) {
+      DexEncodedMethod method,
+      MethodNamingState<?> namingState,
+      InterfaceMethodGroupState groupState) {
     // Check if the name is available in all states.
     return namingState.nextName(method, (candidate, ignore) -> groupState.isAvailable(candidate));
   }
@@ -655,11 +667,11 @@
             });
   }
 
-  private boolean verifyAllCallSitesAreRepresentedIn(List<Wrapper<DexMethod>> groups) {
-    Set<Wrapper<DexMethod>> unifiedMethods = new HashSet<>(groups);
+  private boolean verifyAllCallSitesAreRepresentedIn(List<Wrapper<DexEncodedMethod>> groups) {
+    Set<Wrapper<DexEncodedMethod>> unifiedMethods = new HashSet<>(groups);
     Set<DexCallSite> unifiedSeen = new HashSet<>();
     Set<DexCallSite> seen = new HashSet<>();
-    for (Map.Entry<Wrapper<DexMethod>, InterfaceMethodGroupState> state :
+    for (Map.Entry<Wrapper<DexEncodedMethod>, InterfaceMethodGroupState> state :
         globalStateMap.entrySet()) {
       for (DexCallSite callSite : state.getValue().callSites) {
         seen.add(callSite);
@@ -674,13 +686,13 @@
     return true;
   }
 
-  private boolean verifyAllMethodsAreRepresentedIn(List<Wrapper<DexMethod>> groups) {
-    Set<Wrapper<DexMethod>> unifiedMethods = new HashSet<>(groups);
-    Set<DexMethod> unifiedSeen = new HashSet<>();
-    Set<DexMethod> seen = new HashSet<>();
-    for (Map.Entry<Wrapper<DexMethod>, InterfaceMethodGroupState> state :
+  private boolean verifyAllMethodsAreRepresentedIn(List<Wrapper<DexEncodedMethod>> groups) {
+    Set<Wrapper<DexEncodedMethod>> unifiedMethods = new HashSet<>(groups);
+    Set<DexEncodedMethod> unifiedSeen = Sets.newIdentityHashSet();
+    Set<DexEncodedMethod> seen = Sets.newIdentityHashSet();
+    for (Map.Entry<Wrapper<DexEncodedMethod>, InterfaceMethodGroupState> state :
         globalStateMap.entrySet()) {
-      for (DexMethod method : state.getValue().methodStates.keySet()) {
+      for (DexEncodedMethod method : state.getValue().methodStates.keySet()) {
         seen.add(method);
         if (unifiedMethods.contains(state.getKey())) {
           boolean added = unifiedSeen.add(method);
@@ -693,12 +705,12 @@
     return true;
   }
 
-  private void print(DexMethod method, Set<DexMethod> sourceMethods, PrintStream out) {
+  private void print(DexMethod method, Set<DexEncodedMethod> sourceMethods, PrintStream out) {
     out.println("-----------------------------------------------------------------------");
     out.println("assignNameToInterfaceMethod(`" + method.toSourceString() + "`)");
     out.println("-----------------------------------------------------------------------");
     out.println("Source methods:");
-    for (DexMethod sourceMethod : sourceMethods) {
+    for (DexEncodedMethod sourceMethod : sourceMethods) {
       out.println("  " + sourceMethod.toSourceString());
     }
     out.println("States:");
diff --git a/src/main/java/com/android/tools/r8/naming/MemberNamingStrategy.java b/src/main/java/com/android/tools/r8/naming/MemberNamingStrategy.java
index cddbea8..58a4dc6 100644
--- a/src/main/java/com/android/tools/r8/naming/MemberNamingStrategy.java
+++ b/src/main/java/com/android/tools/r8/naming/MemberNamingStrategy.java
@@ -15,7 +15,7 @@
 public interface MemberNamingStrategy {
 
   DexString next(
-      DexMethod method,
+      DexEncodedMethod method,
       InternalNamingState internalState,
       BiPredicate<DexString, DexMethod> isAvailable);
 
diff --git a/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java b/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
index cdb9166..7b3e763 100644
--- a/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
@@ -89,8 +89,8 @@
   // from the method name minifier to the interface method name minifier.
   class State {
 
-    void putRenaming(DexMethod key, DexString value) {
-      renaming.put(key, value);
+    void putRenaming(DexEncodedMethod key, DexString value) {
+      renaming.put(key.getReference(), value);
     }
 
     MethodReservationState<?> getReservationState(DexType type) {
@@ -221,21 +221,21 @@
   }
 
   private void assignNameToMethod(
-      DexClass holder, DexEncodedMethod encodedMethod, MethodNamingState<?> state) {
-    if (encodedMethod.accessFlags.isConstructor()) {
+      DexClass holder, DexEncodedMethod method, MethodNamingState<?> state) {
+    if (method.isInitializer()) {
       return;
     }
     // The strategy may have an explicit naming for this member which we query first. It may be that
     // the strategy will return the identity name, for which we have to look into a previous
     // renaming tracked by the state.
-    DexString newName = strategy.getReservedName(encodedMethod, holder);
-    if (newName == null || newName == encodedMethod.method.name) {
-      newName = state.newOrReservedNameFor(encodedMethod.method);
+    DexString newName = strategy.getReservedName(method, holder);
+    if (newName == null || newName == method.getName()) {
+      newName = state.newOrReservedNameFor(method);
     }
-    if (encodedMethod.method.name != newName) {
-      renaming.put(encodedMethod.method, newName);
+    if (method.getName() != newName) {
+      renaming.put(method.getReference(), newName);
     }
-    state.addRenaming(newName, encodedMethod.method);
+    state.addRenaming(newName, method);
   }
 
   private void reserveNamesInClasses() {
@@ -280,7 +280,7 @@
       for (DexEncodedMethod method : shuffleMethods(holder.methods(), appView.options())) {
         DexString reservedName = strategy.getReservedName(method, holder);
         if (reservedName != null) {
-          state.reserveName(reservedName, method.method);
+          state.reserveName(reservedName, method);
         }
       }
     }
diff --git a/src/main/java/com/android/tools/r8/naming/MethodNamingState.java b/src/main/java/com/android/tools/r8/naming/MethodNamingState.java
index 85c2f0f..5aa368b 100644
--- a/src/main/java/com/android/tools/r8/naming/MethodNamingState.java
+++ b/src/main/java/com/android/tools/r8/naming/MethodNamingState.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.naming;
 
+import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.naming.MethodNamingState.InternalNewNameState;
@@ -44,37 +45,38 @@
         this, this.keyTransform, this.namingStrategy, frontierReservationState);
   }
 
-  DexString newOrReservedNameFor(DexMethod method) {
+  DexString newOrReservedNameFor(DexEncodedMethod method) {
     return newOrReservedNameFor(method, this::isAvailable);
   }
 
-  DexString newOrReservedNameFor(DexMethod method, BiPredicate<DexString, DexMethod> isAvailable) {
-    DexString newName = getAssignedName(method);
+  DexString newOrReservedNameFor(
+      DexEncodedMethod method, BiPredicate<DexString, DexMethod> isAvailable) {
+    DexString newName = getAssignedName(method.getReference());
     if (newName != null) {
       return newName;
     }
-    Set<DexString> reservedNamesFor = reservationState.getReservedNamesFor(method);
+    Set<DexString> reservedNamesFor = reservationState.getReservedNamesFor(method.getReference());
     // Reservations with applymapping can cause multiple reserved names added to the frontier. In
     // that case, the strategy will return the correct one.
     if (reservedNamesFor != null && reservedNamesFor.size() == 1) {
       DexString candidate = reservedNamesFor.iterator().next();
-      if (isAvailable(candidate, method)) {
+      if (isAvailable(candidate, method.getReference())) {
         return candidate;
       }
     }
     return nextName(method, isAvailable);
   }
 
-  DexString nextName(DexMethod method, BiPredicate<DexString, DexMethod> isAvailable) {
-    InternalNewNameState internalState = getOrCreateInternalState(method);
+  DexString nextName(DexEncodedMethod method, BiPredicate<DexString, DexMethod> isAvailable) {
+    InternalNewNameState internalState = getOrCreateInternalState(method.getReference());
     DexString newName = namingStrategy.next(method, internalState, isAvailable);
     assert newName != null;
     return newName;
   }
 
-  void addRenaming(DexString newName, DexMethod method) {
-    InternalNewNameState internalState = getOrCreateInternalState(method);
-    internalState.addRenaming(newName, method);
+  void addRenaming(DexString newName, DexEncodedMethod method) {
+    InternalNewNameState internalState = getOrCreateInternalState(method.getReference());
+    internalState.addRenaming(newName, method.getReference());
   }
 
   boolean isAvailable(DexString candidate, DexMethod method) {
diff --git a/src/main/java/com/android/tools/r8/naming/MethodReservationState.java b/src/main/java/com/android/tools/r8/naming/MethodReservationState.java
index 2ce35f9..b963b3f 100644
--- a/src/main/java/com/android/tools/r8/naming/MethodReservationState.java
+++ b/src/main/java/com/android/tools/r8/naming/MethodReservationState.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.naming;
 
+import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.naming.MethodReservationState.InternalReservationState;
@@ -36,9 +37,9 @@
     return new MethodReservationState<>(this, this.keyTransform);
   }
 
-  void reserveName(DexString reservedName, DexMethod method) {
+  void reserveName(DexString reservedName, DexEncodedMethod method) {
     try {
-      getOrCreateInternalState(method).reserveName(method, reservedName);
+      getOrCreateInternalState(method.getReference()).reserveName(method, reservedName);
     } catch (AssertionError err) {
       throw new RuntimeException(
           String.format(
@@ -91,13 +92,14 @@
       return originalToReservedNames.get(MethodSignatureEquivalence.get().wrap(method));
     }
 
-    void reserveName(DexMethod method, DexString name) {
+    void reserveName(DexEncodedMethod method, DexString name) {
       if (reservedNames == null) {
         assert originalToReservedNames == null;
         originalToReservedNames = new HashMap<>();
         reservedNames = new HashSet<>();
       }
-      final Wrapper<DexMethod> wrapped = MethodSignatureEquivalence.get().wrap(method);
+      final Wrapper<DexMethod> wrapped =
+          MethodSignatureEquivalence.get().wrap(method.getReference());
       originalToReservedNames.computeIfAbsent(wrapped, ignore -> new HashSet<>()).add(name);
       reservedNames.add(name);
     }
diff --git a/src/main/java/com/android/tools/r8/naming/Minifier.java b/src/main/java/com/android/tools/r8/naming/Minifier.java
index d0f0381..182de8d 100644
--- a/src/main/java/com/android/tools/r8/naming/Minifier.java
+++ b/src/main/java/com/android/tools/r8/naming/Minifier.java
@@ -225,16 +225,15 @@
 
     @Override
     public DexString next(
-        DexMethod method,
+        DexEncodedMethod method,
         InternalNamingState internalState,
         BiPredicate<DexString, DexMethod> isAvailable) {
-      assert checkAllowMemberRenaming(method.holder);
-      DexEncodedMethod encodedMethod = appView.definitionFor(method);
-      boolean isDirectOrStatic = encodedMethod.isDirectMethod() || encodedMethod.isStatic();
+      assert checkAllowMemberRenaming(method.getHolderType());
+      boolean isDirectOrStatic = method.isDirectMethod() || method.isStatic();
       DexString candidate;
       do {
         candidate = getNextName(internalState, isDirectOrStatic);
-      } while (!isAvailable.test(candidate, method));
+      } while (!isAvailable.test(candidate, method.getReference()));
       return candidate;
     }
 
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
index e720b30..515d21f 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
@@ -188,11 +188,11 @@
       Set<DexReference> notMappedReferences,
       SubtypingInfo subtypingInfo) {
     ClassNamingForMapApplier classNaming = seedMapper.getClassNaming(type);
-    DexClass dexClass = appView.definitionFor(type);
+    DexClass clazz = appView.definitionFor(type);
 
     // Keep track of classes that needs to get renamed.
-    if (dexClass != null && (classNaming != null || dexClass.isProgramClass())) {
-      mappedClasses.add(dexClass);
+    if (clazz != null && (classNaming != null || clazz.isProgramClass())) {
+      mappedClasses.add(clazz);
     }
 
     Map<DexReference, MemberNaming> nonPrivateMembers = new IdentityHashMap<>();
@@ -205,7 +205,7 @@
           memberNaming -> addMemberNamings(type, memberNaming, nonPrivateMembers, false));
     } else {
       // We have to ensure we do not rename to an existing member, that cannot be renamed.
-      if (dexClass == null || !appView.options().isMinifying()) {
+      if (clazz == null || !appView.options().isMinifying()) {
         notMappedReferences.add(type);
       } else if (appView.options().isMinifying()
           && appView.rootSet().mayNotBeMinified(type, appView)) {
@@ -222,10 +222,10 @@
           if (!memberNames.containsKey(parentReferenceOnCurrentType)) {
             addMemberNaming(
                 parentReferenceOnCurrentType, parentMembers.get(key), additionalMethodNamings);
-          } else {
-            DexEncodedMethod encodedMethod = appView.definitionFor(parentReferenceOnCurrentType);
-            assert encodedMethod == null
-                || encodedMethod.accessFlags.isStatic()
+          } else if (clazz != null) {
+            DexEncodedMethod method = clazz.lookupMethod(parentReferenceOnCurrentType);
+            assert method == null
+                || method.isStatic()
                 || memberNames
                     .get(parentReferenceOnCurrentType)
                     .getRenamedName()
@@ -245,12 +245,12 @@
       }
     }
 
-    if (dexClass != null) {
+    if (clazz != null) {
       // If a class is marked as abstract it is allowed to not implement methods from interfaces
       // thus the map will not contain a mapping. Also, if an interface is defined in the library
       // and the class is in the program, we have to build up the correct names to reserve them.
-      if (dexClass.isProgramClass() || dexClass.isAbstract()) {
-        addNonPrivateInterfaceMappings(type, nonPrivateMembers, dexClass.interfaces.values);
+      if (clazz.isProgramClass() || clazz.isAbstract()) {
+        addNonPrivateInterfaceMappings(type, nonPrivateMembers, clazz.interfaces.values);
       }
     }
 
@@ -293,8 +293,9 @@
       DexMethod originalMethod = ((MethodSignature) signature).toDexMethod(factory, type);
       addMemberNaming(
           originalMethod, memberNaming, addToAdditionalMaps ? additionalMethodNamings : null);
-      DexEncodedMethod encodedMethod = appView.definitionFor(originalMethod);
-      if (encodedMethod == null || !encodedMethod.accessFlags.isPrivate()) {
+      DexClass holder = appView.definitionForHolder(originalMethod);
+      DexEncodedMethod definition = originalMethod.lookupOnClass(holder);
+      if (definition == null || !definition.accessFlags.isPrivate()) {
         nonPrivateMembers.put(originalMethod, memberNaming);
       }
     } else {
@@ -466,12 +467,12 @@
 
     @Override
     public DexString next(
-        DexMethod reference,
+        DexEncodedMethod method,
         InternalNamingState internalState,
         BiPredicate<DexString, DexMethod> isAvailable) {
+      DexMethod reference = method.getReference();
       DexClass holder = appView.definitionForHolder(reference);
       assert holder != null;
-      DexEncodedMethod method = holder.lookupMethod(reference);
       DexString reservedName = getReservedName(method, reference.name, holder);
       DexString nextName;
       if (reservedName != null) {
@@ -482,7 +483,7 @@
       } else {
         assert !mappedNames.containsKey(reference);
         assert appView.rootSet().mayBeMinified(reference, appView);
-        nextName = super.next(reference, internalState, isAvailable);
+        nextName = super.next(method, internalState, isAvailable);
       }
       assert nextName == reference.name || !method.isInitializer();
       assert nextName == reference.name || !holder.isAnnotation();
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 00a2136..b42920e 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1210,10 +1210,11 @@
 
       public Comparator<DexMethod> interfaceMethodOrdering = null;
 
-      public Comparator<Wrapper<DexMethod>> getInterfaceMethodOrderingOrDefault(
-          Comparator<Wrapper<DexMethod>> comparator) {
+      public Comparator<Wrapper<DexEncodedMethod>> getInterfaceMethodOrderingOrDefault(
+          Comparator<Wrapper<DexEncodedMethod>> comparator) {
         if (interfaceMethodOrdering != null) {
-          return (a, b) -> interfaceMethodOrdering.compare(a.get(), b.get());
+          return (a, b) ->
+              interfaceMethodOrdering.compare(a.get().getReference(), b.get().getReference());
         }
         return comparator;
       }
