diff --git a/src/main/java/com/android/tools/r8/PrintUses.java b/src/main/java/com/android/tools/r8/PrintUses.java
index 5fe37ab..c94d67c 100644
--- a/src/main/java/com/android/tools/r8/PrintUses.java
+++ b/src/main/java/com/android/tools/r8/PrintUses.java
@@ -120,7 +120,7 @@
 
     @Override
     public boolean registerInvokeStatic(DexMethod method) {
-      DexEncodedMethod target = appInfo.lookupStaticTarget(method, context);
+      DexEncodedMethod target = appInfo.unsafeResolveMethodDueToDexFormat(method).getSingleTarget();
       if (target != null && target.method != method) {
         addType(method.holder);
         addMethod(target.method);
@@ -148,13 +148,13 @@
 
     @Override
     public boolean registerInstanceFieldWrite(DexField field) {
-      addField(field, false);
+      addField(field);
       return false;
     }
 
     @Override
     public boolean registerInstanceFieldRead(DexField field) {
-      addField(field, false);
+      addField(field);
       return false;
     }
 
@@ -166,13 +166,13 @@
 
     @Override
     public boolean registerStaticFieldRead(DexField field) {
-      addField(field, true);
+      addField(field);
       return false;
     }
 
     @Override
     public boolean registerStaticFieldWrite(DexField field) {
-      addField(field, true);
+      addField(field);
       return false;
     }
 
@@ -200,10 +200,9 @@
       return descriptors.contains(type.toDescriptorString());
     }
 
-    private void addField(DexField field, boolean isStatic) {
+    private void addField(DexField field) {
       addType(field.type);
-      DexEncodedField baseField =
-          isStatic ? appInfo.lookupStaticTarget(field) : appInfo.lookupInstanceTarget(field);
+      DexEncodedField baseField = appInfo.resolveField(field).getResolvedField();
       if (baseField != null && baseField.holder() != field.holder) {
         field = baseField.field;
       }
@@ -229,13 +228,14 @@
       addType(method.proto.returnType);
       Set<DexMethod> typeMethods = methods.get(method.holder);
       if (typeMethods != null) {
-        DexEncodedMethod encodedMethod = appInfo.definitionFor(method);
-        assert encodedMethod != null : "Could not find method " + method.toString();
+        DexClass holder = appInfo.definitionForHolder(method);
+        DexEncodedMethod definition = method.lookupOnClass(holder);
+        assert definition != null : "Could not find method " + method.toString();
         if (!allowObfuscation) {
           noObfuscationTypes.add(method.holder);
         }
-        if (encodedMethod.accessFlags.isVisibilityDependingOnPackage()) {
-          keepPackageNames.add(encodedMethod.holder().getPackageName());
+        if (definition.accessFlags.isVisibilityDependingOnPackage()) {
+          keepPackageNames.add(definition.holder().getPackageName());
         }
         typeMethods.add(method);
       }
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfo.java b/src/main/java/com/android/tools/r8/graph/AppInfo.java
index 3706dec..60b8220 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfo.java
@@ -161,21 +161,6 @@
     return definition == null ? Origin.unknown() : definition.origin;
   }
 
-  @Deprecated
-  @Override
-  public DexEncodedMethod definitionFor(DexMethod method) {
-    assert checkIfObsolete();
-    assert method.holder.isClassType();
-    if (!method.holder.isClassType()) {
-      return null;
-    }
-    DexClass clazz = definitionFor(method.holder);
-    if (clazz == null) {
-      return null;
-    }
-    return clazz.getMethodCollection().getMethod(method);
-  }
-
   /**
    * Lookup static method on the method holder, or answers null.
    *
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java
index b4534f5..9763f50 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -226,12 +226,6 @@
     return this.sourceDebugExtensions.get(clazz);
   }
 
-  @Deprecated
-  @Override
-  public final DexEncodedMethod definitionFor(DexMethod method) {
-    return appInfo().definitionFor(method);
-  }
-
   @Override
   public final DexClass definitionFor(DexType type) {
     return appInfo().definitionFor(type);
diff --git a/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java b/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
index 214e41c..2ec6dbf 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
@@ -6,9 +6,6 @@
 
 public interface DexDefinitionSupplier {
 
-  @Deprecated
-  DexEncodedMethod definitionFor(DexMethod method);
-
   DexClass definitionFor(DexType type);
 
   DexProgramClass definitionForProgramType(DexType type);
diff --git a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
index 95922dc..ab9be40 100644
--- a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
@@ -73,13 +73,6 @@
     return classpathClasses;
   }
 
-  @Deprecated
-  @Override
-  public DexEncodedMethod definitionFor(DexMethod method) {
-    DexClass clazz = definitionFor(method.holder);
-    return clazz != null ? clazz.lookupMethod(method) : null;
-  }
-
   @Override
   public DexClass definitionFor(DexType type) {
     assert type.isClassType() : "Cannot lookup definition for type: " + type;
diff --git a/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java b/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java
index 5a8f39f..3c7b2d8 100644
--- a/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java
+++ b/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java
@@ -21,7 +21,7 @@
   }
 
   void checkClass(DexClass clazz) {
-    if (pinnedPredicate.isPinned(clazz.type)) {
+    if (pinnedPredicate.isPinned(clazz)) {
       if (pinnedInstantiations == null) {
         pinnedInstantiations = Sets.newIdentityHashSet();
       }
@@ -30,7 +30,7 @@
   }
 
   void checkMethod(DexEncodedMethod method) {
-    if (pinnedPredicate.isPinned(method.method)) {
+    if (pinnedPredicate.isPinned(method)) {
       if (pinnedMethods == null) {
         pinnedMethods = Sets.newIdentityHashSet();
       }
@@ -70,7 +70,7 @@
       }
       DexEncodedMethod methodInClass = parent.lookupVirtualMethod(method);
       if (methodInClass != null
-          && (parent.isNotProgramClass() || pinnedPredicate.isPinned(methodInClass.method))) {
+          && (parent.isNotProgramClass() || pinnedPredicate.isPinned(methodInClass))) {
         return true;
       }
       if (parent.superType != null) {
diff --git a/src/main/java/com/android/tools/r8/graph/PinnedPredicate.java b/src/main/java/com/android/tools/r8/graph/PinnedPredicate.java
index d81becc..5828fd5 100644
--- a/src/main/java/com/android/tools/r8/graph/PinnedPredicate.java
+++ b/src/main/java/com/android/tools/r8/graph/PinnedPredicate.java
@@ -7,5 +7,5 @@
 @FunctionalInterface
 public interface PinnedPredicate {
 
-  boolean isPinned(DexReference reference);
+  boolean isPinned(DexDefinition reference);
 }
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 4e96594..d8eab37 100644
--- a/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
@@ -372,8 +372,7 @@
         // This is assuming that the method is accessible, which implies self/nest access.
         // Only include if the target has code or is native.
         boolean isIncomplete =
-            pinnedPredicate.isPinned(resolvedHolder.type)
-                && pinnedPredicate.isPinned(resolvedMethod.method);
+            pinnedPredicate.isPinned(resolvedHolder) && pinnedPredicate.isPinned(resolvedMethod);
         return LookupResult.createResult(
             Collections.singletonMap(
                 resolvedMethod, DexClassAndMethod.create(resolvedHolder, resolvedMethod)),
@@ -541,18 +540,17 @@
         LambdaDescriptor lambdaInstance, AppInfoWithClassHierarchy appInfo) {
       if (lambdaInstance.getMainMethod().match(resolvedMethod)) {
         DexMethod method = lambdaInstance.implHandle.asMethod();
-        DexClass holder = appInfo.definitionFor(method.holder);
+        DexClass holder = appInfo.definitionForHolder(method);
         if (holder == null) {
           assert false;
           return null;
         }
-        DexEncodedMethod encodedMethod = appInfo.definitionFor(method);
-        if (encodedMethod == null) {
+        DexEncodedMethod definition = holder.lookupMethod(method);
+        if (definition == null) {
           // The targeted method might not exist, eg, Throwable.addSuppressed in an old library.
           return null;
         }
-        return new LookupLambdaTarget(
-            lambdaInstance, DexClassAndMethod.create(holder, encodedMethod));
+        return new LookupLambdaTarget(lambdaInstance, DexClassAndMethod.create(holder, definition));
       }
       return lookupMaximallySpecificDispatchTarget(lambdaInstance, appInfo);
     }
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 41f5dc8..416f064 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
@@ -297,7 +297,9 @@
           return false;
         }
       }
-      DexEncodedMethod method = appView.definitionFor(instruction.getInvokedMethod());
+      DexMethod invokedMethod = instruction.getInvokedMethod();
+      DexClass holder = appView.definitionForHolder(invokedMethod);
+      DexEncodedMethod method = invokedMethod.lookupOnClass(holder);
       return method != null && isTypeInitializedBy(instruction, type, method, appView, mode);
     }
 
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 00c88b8..e89d9b0 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
@@ -117,10 +117,10 @@
       return result;
     }
     // Allow optimizing static library invokes in D8.
-    DexClass clazz = appView.definitionFor(getInvokedMethod().holder);
+    DexClass clazz = appView.definitionForHolder(getInvokedMethod());
     if (clazz != null
         && (clazz.isLibraryClass() || appView.libraryMethodOptimizer().isModeled(clazz.type))) {
-      return appView.definitionFor(getInvokedMethod());
+      return clazz.lookupMethod(getInvokedMethod());
     }
     // In D8, we can treat invoke-static instructions as having a single target if the invoke is
     // targeting a method in the enclosing class.
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 2d95115..951a451 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
@@ -130,7 +130,7 @@
       DexClass clazz = appView.definitionFor(holder);
       if (clazz != null
           && (clazz.isLibraryClass() || appView.libraryMethodOptimizer().isModeled(clazz.type))) {
-        DexEncodedMethod singleTargetCandidate = appView.definitionFor(method);
+        DexEncodedMethod singleTargetCandidate = clazz.lookupMethod(method);
         if (singleTargetCandidate != null && (clazz.isFinal() || singleTargetCandidate.isFinal())) {
           return singleTargetCandidate;
         }
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 fbeff68..f1c403b 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
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.ir.conversion;
 
+import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
+
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -126,10 +128,10 @@
             .reprocess
             .forEach(
                 reference -> {
-                  DexEncodedMethod definition = appView.definitionFor(reference);
+                  DexProgramClass clazz =
+                      asProgramClassOrNull(appView.definitionForHolder(reference));
+                  DexEncodedMethod definition = reference.lookupOnClass(clazz);
                   if (definition != null) {
-                    DexProgramClass clazz =
-                        appView.definitionForHolder(definition).asProgramClass();
                     set.createAndAdd(clazz, definition);
                   }
                 });
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 9e270af..8a25765 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
@@ -44,6 +44,7 @@
 import static com.android.tools.r8.ir.code.Opcodes.XOR;
 
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexField;
@@ -549,7 +550,8 @@
             {
               InvokeDirect invoke = instruction.asInvokeDirect();
               DexMethod invokedMethod = invoke.getInvokedMethod();
-              DexEncodedMethod singleTarget = appView.definitionFor(invokedMethod);
+              DexClass holder = appView.definitionForHolder(invokedMethod);
+              DexEncodedMethod singleTarget = invokedMethod.lookupOnClass(holder);
               if (singleTarget == null) {
                 return null;
               }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java
index 92c78af..e7e0fe6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java
@@ -7,6 +7,7 @@
 import static com.android.tools.r8.ir.analysis.type.Nullability.maybeNull;
 
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -101,10 +102,11 @@
   }
 
   private DexEncodedMethod lookupMethod(DexMethod method) {
-    DexEncodedMethod encodedMethod = appView.definitionFor(method);
-    if (encodedMethod != null) {
+    DexClass holder = appView.definitionForHolder(method);
+    DexEncodedMethod definition = method.lookupOnClass(holder);
+    if (definition != null) {
       modeledLibraryTypes.add(method.holder);
-      return encodedMethod;
+      return definition;
     }
     return null;
   }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
index ba814e9..680bd5c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
@@ -121,11 +121,6 @@
     }
 
     @Override
-    public DexEncodedMethod definitionFor(DexMethod method) {
-      throw new Unreachable("Should not be called");
-    }
-
-    @Override
     public DexClass definitionFor(DexType type) {
       // TODO(b/157700128) Metadata cannot at this point keep anything alive. Therefore, if a type
       //  has been pruned it may still be referenced, so we do an early check here to ensure it will
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 87bfd9a..f617c31 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexClasspathClass;
+import com.android.tools.r8.graph.DexDefinition;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexField;
@@ -1338,22 +1339,17 @@
     return isInstantiatedDirectly(clazz) || isPinned(clazz.type) || isInstantiatedInterface(clazz);
   }
 
-  public boolean isPinnedNotProgramOrLibraryOverride(DexReference reference) {
-    if (isPinned(reference)) {
+  public boolean isPinnedNotProgramOrLibraryOverride(DexDefinition definition) {
+    if (isPinned(definition.toReference())) {
       return true;
     }
-    if (reference.isDexMethod()) {
-      DexEncodedMethod method = definitionFor(reference.asDexMethod());
-      return method == null
-          || !method.isProgramMethod(this)
-          || method.isLibraryMethodOverride().isPossiblyTrue();
-    } else {
-      assert reference.isDexType();
-      DexClass clazz = definitionFor(reference.asDexType());
-      return clazz == null
-          || clazz.isNotProgramClass()
-          || isInstantiatedInterface(clazz.asProgramClass());
+    if (definition.isDexEncodedMethod()) {
+      DexEncodedMethod method = definition.asDexEncodedMethod();
+      return !method.isProgramMethod(this) || method.isLibraryMethodOverride().isPossiblyTrue();
     }
+    assert definition.isDexClass();
+    DexClass clazz = definition.asDexClass();
+    return clazz.isNotProgramClass() || isInstantiatedInterface(clazz.asProgramClass());
   }
 
   public SubtypingInfo computeSubtypingInfo() {
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 53057cc..76c9e4c 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2496,7 +2496,7 @@
             (type, subTypeConsumer, lambdaConsumer) ->
                 objectAllocationInfoCollection.forEachInstantiatedSubType(
                     type, subTypeConsumer, lambdaConsumer, appInfo),
-            reference -> keepInfo.isPinned(reference, appInfo))
+            definition -> keepInfo.isPinned(definition.toReference(), appInfo))
         .forEach(
             target ->
                 markVirtualDispatchTargetAsLive(
@@ -4161,12 +4161,6 @@
       this.enqueuer = enqueuer;
     }
 
-    @Deprecated
-    @Override
-    public DexEncodedMethod definitionFor(DexMethod method) {
-      return enqueuer.definitionFor(method);
-    }
-
     @Override
     public DexClass definitionFor(DexType type) {
       return enqueuer.definitionFor(type);
