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 9bf667b..dcad411 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfo.java
@@ -201,6 +201,61 @@
     definitions.remove(type);
   }
 
+  // TODO(b/147578480): Temporary API since most of the code base use a type instead
+  // of a DexProgramClass as the invocationContext.
+  DexProgramClass toProgramClass(DexType type) {
+    assert type.isClassType();
+    return DexProgramClass.asProgramClassOrNull(definitionFor(type));
+  }
+
+  /**
+   * Lookup static method on the method holder, or answers null.
+   *
+   * @param method the method to lookup
+   * @param invocationContext the class the invoke is contained in, i.e., the holder of the caller.
+   * @return The actual target for {@code method} if on the holder, or {@code null}.
+   */
+  @Deprecated // TODO(b/147578480): Remove
+  public DexEncodedMethod lookupStaticTargetOnItself(DexMethod method, DexType invocationContext) {
+    return lookupStaticTargetOnItself(method, toProgramClass(invocationContext));
+  }
+
+  public final DexEncodedMethod lookupStaticTargetOnItself(
+      DexMethod method, DexProgramClass invocationContext) {
+    if (method.holder != invocationContext.type) {
+      return null;
+    }
+    DexEncodedMethod singleTarget = invocationContext.lookupDirectMethod(method);
+    if (singleTarget.isStatic()) {
+      return singleTarget;
+    }
+    return null;
+  }
+
+  /**
+   * Lookup direct method on the method holder, or answers null.
+   *
+   * @param method the method to lookup
+   * @param invocationContext the class the invoke is contained in, i.e., the holder of the caller.
+   * @return The actual target for {@code method} if on the holder, or {@code null}.
+   */
+  @Deprecated // TODO(b/147578480): Remove
+  public DexEncodedMethod lookupDirectTargetOnItself(DexMethod method, DexType invocationContext) {
+    return lookupDirectTargetOnItself(method, toProgramClass(invocationContext));
+  }
+
+  public final DexEncodedMethod lookupDirectTargetOnItself(
+      DexMethod method, DexProgramClass invocationContext) {
+    if (method.holder != invocationContext.type) {
+      return null;
+    }
+    DexEncodedMethod singleTarget = invocationContext.lookupDirectMethod(method);
+    if (!singleTarget.isStatic()) {
+      return singleTarget;
+    }
+    return null;
+  }
+
   // TODO(b/147578480): RemoveDeprecation Use AppInfoWithClassHierarchy and
   // lookupXX(DexMethod, DexProgramClass). The following 3 methods should either be removed or
   // return null.
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
index 945a773..87a2343 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
@@ -145,14 +145,4 @@
     assert checkIfObsolete();
     return resolveMethod(method.holder, method).lookupInvokeDirectTarget(invocationContext, this);
   }
-
-  private DexProgramClass toProgramClass(DexType type) {
-    assert type.isClassType();
-    DexClass clazz = definitionFor(type);
-    if (clazz == null) {
-      return null;
-    }
-    assert clazz.isProgramClass();
-    return clazz.asProgramClass();
-  }
 }
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 29c6b76..db939e8 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
@@ -125,22 +125,14 @@
     DexMethod invokedMethod = getInvokedMethod();
     if (appView.appInfo().hasLiveness()) {
       AppInfoWithLiveness appInfo = appView.appInfo().withLiveness();
-      return appInfo.lookupDirectTarget(invokedMethod, invocationContext);
+      DexEncodedMethod result = appInfo.lookupDirectTarget(invokedMethod, invocationContext);
+      assert verifyD8LookupResult(
+          result, appView.appInfo().lookupDirectTargetOnItself(invokedMethod, invocationContext));
+      return result;
     }
     // In D8, we can treat invoke-direct instructions as having a single target if the invoke is
     // targeting a method in the enclosing class.
-    if (invokedMethod.holder == invocationContext) {
-      DexClass clazz = appView.definitionFor(invokedMethod.holder);
-      if (clazz != null && clazz.isProgramClass()) {
-        DexEncodedMethod singleTarget = clazz.lookupDirectMethod(invokedMethod);
-        if (!singleTarget.isStatic()) {
-          return singleTarget;
-        }
-      } else {
-        assert false;
-      }
-    }
-    return null;
+    return appView.appInfo().lookupDirectTargetOnItself(invokedMethod, invocationContext);
   }
 
   @Override
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 e7d2ab1..451b9a5 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
@@ -199,4 +199,13 @@
     }
     return UnknownValue.getInstance();
   }
+
+  boolean verifyD8LookupResult(
+      DexEncodedMethod hierarchyResult, DexEncodedMethod lookupDirectTargetOnItself) {
+    if (lookupDirectTargetOnItself == null) {
+      return true;
+    }
+    assert lookupDirectTargetOnItself == hierarchyResult;
+    return true;
+  }
 }
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 6893f5f..c8f8b49 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
@@ -8,7 +8,6 @@
 import com.android.tools.r8.cf.code.CfInvoke;
 import com.android.tools.r8.code.InvokeStaticRange;
 import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
@@ -105,22 +104,14 @@
     DexMethod invokedMethod = getInvokedMethod();
     if (appView.appInfo().hasLiveness()) {
       AppInfoWithLiveness appInfo = appView.appInfo().withLiveness();
-      return appInfo.lookupStaticTarget(invokedMethod, invocationContext);
+      DexEncodedMethod result = appInfo.lookupStaticTarget(invokedMethod, invocationContext);
+      assert verifyD8LookupResult(
+          result, appView.appInfo().lookupStaticTargetOnItself(invokedMethod, invocationContext));
+      return result;
     }
     // In D8, we can treat invoke-static instructions as having a single target if the invoke is
     // targeting a method in the enclosing class.
-    if (invokedMethod.holder == invocationContext) {
-      DexClass clazz = appView.definitionFor(invokedMethod.holder);
-      if (clazz != null && clazz.isProgramClass()) {
-        DexEncodedMethod singleTarget = clazz.lookupDirectMethod(invokedMethod);
-        if (singleTarget.isStatic()) {
-          return singleTarget;
-        }
-      } else {
-        assert false;
-      }
-    }
-    return null;
+    return appView.appInfo().lookupStaticTargetOnItself(invokedMethod, invocationContext);
   }
 
   @Override
