diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 0990f79..4025180 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
 
   // This field is accessed from release scripts using simple pattern matching.
   // Therefore, changing this field could break our release scripts.
-  public static final String LABEL = "1.3.8-dev";
+  public static final String LABEL = "1.3.9-dev";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstString.java b/src/main/java/com/android/tools/r8/cf/code/CfConstString.java
index 54ae1c6..b2114b3 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstString.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstString.java
@@ -13,7 +13,7 @@
 
 public class CfConstString extends CfInstruction {
 
-  private final DexString string;
+  private DexString string;
 
   public CfConstString(DexString string) {
     this.string = string;
@@ -23,6 +23,10 @@
     return string;
   }
 
+  public void setString(DexString string) {
+    this.string = string;
+  }
+
   @Override
   public void write(MethodVisitor visitor, NamingLens lens) {
     visitor.visitLdcInsn(string.toString());
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 f276cb2..f5b0a31 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
@@ -385,6 +385,9 @@
     boolean didPositionChange =
         position.isSome()
             && position != currentPosition
+            // Ignore synthetic positions prior to any actual position, except when inlined
+            // (that is, callerPosition != null).
+            && !(currentPosition.isNone() && position.synthetic && position.callerPosition == null)
             && (options.debug || instruction.instructionTypeCanThrow());
     if (!didLocalsChange && !didPositionChange) {
       return;
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 92645c4..bc2222f 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
@@ -182,7 +182,6 @@
   private CfState state;
   private final CfCode code;
   private final DexEncodedMethod method;
-  private final Position callerPosition;
   private final Origin origin;
 
   private final Reference2IntMap<CfLabel> labelOffsets = new Reference2IntOpenHashMap<>();
@@ -205,7 +204,6 @@
       boolean preserveCaller) {
     this.code = code;
     this.method = method;
-    this.callerPosition = callerPosition;
     this.origin = origin;
     int cfPositionCount = 0;
     for (int i = 0; i < code.getInstructions().size(); i++) {
@@ -328,7 +326,7 @@
   public void buildPrelude(IRBuilder builder) {
     assert !inPrelude;
     inPrelude = true;
-    state.buildPrelude();
+    state.buildPrelude(canonicalPositions.getPreamblePosition());
     setLocalVariableLists();
     buildArgumentInstructions(builder);
     recordStateForTarget(0, state.getSnapshot());
@@ -395,14 +393,8 @@
       if (instruction instanceof CfPosition) {
         CfPosition cfPosition = (CfPosition) instruction;
         Position position = cfPosition.getPosition();
-        Position newPosition =
-            canonicalPositions.getCanonical(
-                new Position(
-                    position.line,
-                    position.file,
-                    position.method,
-                    canonicalPositions.canonicalizeCallerPosition(position.callerPosition)));
-        CfPosition newCfPosition = new CfPosition(cfPosition.getLabel(), newPosition);
+        CfPosition newCfPosition =
+            new CfPosition(cfPosition.getLabel(), getCanonicalPosition(position));
         newCfPosition.buildIR(builder, state, this);
       } else {
         instruction.buildIR(builder, state, this);
@@ -441,7 +433,8 @@
     for (int i = 0; i < stack.length; i++) {
       stack[i] = convertUninitialized(frame.getStack().get(i));
     }
-    state.setStateFromFrame(locals, stack, getDebugPositionAtOffset(currentInstructionIndex));
+    state.setStateFromFrame(
+        locals, stack, getCanonicalDebugPositionAtOffset(currentInstructionIndex));
   }
 
   private DexType convertUninitialized(FrameType type) {
@@ -624,7 +617,7 @@
   }
 
   @Override
-  public Position getDebugPositionAtOffset(int offset) {
+  public Position getCanonicalDebugPositionAtOffset(int offset) {
     while (offset + 1 < code.getInstructions().size()) {
       CfInstruction insn = code.getInstructions().get(offset);
       if (!(insn instanceof CfLabel) && !(insn instanceof CfFrame)) {
@@ -636,13 +629,22 @@
       offset -= 1;
     }
     if (offset < 0) {
-      return Position.noneWithMethod(method.method, callerPosition);
+      return canonicalPositions.getPreamblePosition();
     }
-    return ((CfPosition) code.getInstructions().get(offset)).getPosition();
+    return getCanonicalPosition(((CfPosition) code.getInstructions().get(offset)).getPosition());
   }
 
   @Override
   public Position getCurrentPosition() {
     return state.getPosition();
   }
+
+  private Position getCanonicalPosition(Position position) {
+    return canonicalPositions.getCanonical(
+        new Position(
+            position.line,
+            position.file,
+            position.method,
+            canonicalPositions.canonicalizeCallerPosition(position.callerPosition)));
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfState.java b/src/main/java/com/android/tools/r8/ir/conversion/CfState.java
index 8174797..7f4ee72 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfState.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfState.java
@@ -74,8 +74,8 @@
 
   private static final int MAX_UPDATES = 4;
 
-  public void buildPrelude() {
-    current = new BaseSnapshot();
+  public void buildPrelude(Position preamblePosition) {
+    current = new BaseSnapshot(preamblePosition);
   }
 
   public void clear() {
@@ -92,9 +92,9 @@
     current = new BaseSnapshot(locals, stack, position);
   }
 
-  public void merge(Snapshot snapshot) {
+  public void merge(Snapshot snapshot, Position preamblePosition) {
     if (current == null) {
-      current = snapshot == null ? new BaseSnapshot() : snapshot;
+      current = snapshot == null ? new BaseSnapshot(preamblePosition) : snapshot;
     } else {
       current = merge(current, snapshot, origin);
     }
@@ -312,8 +312,8 @@
     final SlotType[] stack;
     final Position position;
 
-    BaseSnapshot() {
-      this(0, 0, Position.none());
+    BaseSnapshot(Position preamblePosition) {
+      this(0, 0, preamblePosition);
     }
 
     BaseSnapshot(int locals, int stack, Position position) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
index 9a9b836..10bf6a5 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
@@ -184,7 +184,7 @@
   }
 
   @Override
-  public Position getDebugPositionAtOffset(int offset) {
+  public Position getCanonicalDebugPositionAtOffset(int offset) {
     DexDebugEntry entry = getDebugEntryAtOffset(offset);
     return entry == null
         ? canonicalPositions.getPreamblePosition()
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 963cf41..62450d4 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
@@ -592,7 +592,7 @@
     int moveExceptionDest = source.getMoveExceptionRegister(targetIndex);
     if (moveExceptionDest >= 0) {
       Value out = writeRegister(moveExceptionDest, ValueType.OBJECT, ThrowingInfo.NO_THROW, null);
-      Position position = source.getDebugPositionAtOffset(moveExceptionItem.targetOffset);
+      Position position = source.getCanonicalDebugPositionAtOffset(moveExceptionItem.targetOffset);
       MoveException moveException = new MoveException(out);
       moveException.setPosition(position);
       currentBlock.add(moveException);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
index 23d9a73..1170dab 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
@@ -493,7 +493,7 @@
       // Don't include line changes when processing a label. Doing so will end up emitting local
       // writes after the line has changed and thus causing locals to become visible too late.
       currentPosition =
-          getDebugPositionAtOffset(
+          getCanonicalDebugPositionAtOffset(
               ((instructionIndex > 0) && (insn instanceof LabelNode))
                   ? instructionIndex - 1
                   : instructionIndex);
@@ -2832,7 +2832,7 @@
   }
 
   @Override
-  public Position getDebugPositionAtOffset(int offset) {
+  public Position getCanonicalDebugPositionAtOffset(int offset) {
     if (offset == EXCEPTIONAL_SYNC_EXIT_OFFSET) {
       return getExceptionalExitPosition();
     }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index 1877053..e9b789a 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -39,17 +39,17 @@
 import com.android.tools.r8.ir.code.StaticPut;
 import com.android.tools.r8.ir.code.Value;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 public class LensCodeRewriter {
 
   private final GraphLense graphLense;
   private final AppInfoWithSubtyping appInfo;
 
-  private final Map<DexProto, DexProto> protoFixupCache = new HashMap<>();
+  private final Map<DexProto, DexProto> protoFixupCache = new ConcurrentHashMap<>();
 
   public LensCodeRewriter(GraphLense graphLense, AppInfoWithSubtyping appInfo) {
     this.graphLense = graphLense;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/SourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/SourceCode.java
index bf2b51f..2bc2aa1 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/SourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/SourceCode.java
@@ -27,7 +27,7 @@
 
   Position getCurrentPosition();
 
-  Position getDebugPositionAtOffset(int offset);
+  Position getCanonicalDebugPositionAtOffset(int offset);
 
   /**
    * Trace block structure of the source-program.
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 c3a3781..6f3a0f5 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
@@ -1106,7 +1106,7 @@
     }
 
     @Override
-    public Position getDebugPositionAtOffset(int offset) {
+    public Position getCanonicalDebugPositionAtOffset(int offset) {
       throw new Unreachable();
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
index c64d8ed..991d371 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
@@ -214,7 +214,7 @@
   }
 
   @Override
-  public Position getDebugPositionAtOffset(int offset) {
+  public Position getCanonicalDebugPositionAtOffset(int offset) {
     throw new Unreachable();
   }
 
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
index 2fd66d0..d92de6b 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
@@ -5,9 +5,12 @@
 
 import static com.android.tools.r8.utils.DescriptorUtils.descriptorToJavaType;
 
+import com.android.tools.r8.cf.code.CfConstString;
+import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.code.ConstString;
 import com.android.tools.r8.code.ConstStringJumbo;
 import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.graph.CfCode;
 import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedField;
@@ -34,9 +37,7 @@
   private final Set<DexItem> identifierNameStrings;
 
   IdentifierMinifier(
-      AppInfoWithLiveness appInfo,
-      ProguardClassFilter adaptClassStrings,
-      NamingLens lens) {
+      AppInfoWithLiveness appInfo, ProguardClassFilter adaptClassStrings, NamingLens lens) {
     this.appInfo = appInfo;
     this.adaptClassStrings = adaptClassStrings;
     this.lens = lens;
@@ -86,17 +87,29 @@
     if (code == null) {
       return;
     }
-    assert code.isDexCode();
-    DexCode dexCode = code.asDexCode();
-    for (Instruction instr : dexCode.instructions) {
-      if (instr instanceof ConstString) {
-        ConstString cnst = (ConstString) instr;
-        DexString dexString = cnst.getString();
-        cnst.BBBB = getRenamedStringLiteral(dexString);
-      } else if (instr instanceof ConstStringJumbo) {
-        ConstStringJumbo cnst = (ConstStringJumbo) instr;
-        DexString dexString = cnst.getString();
-        cnst.BBBBBBBB = getRenamedStringLiteral(dexString);
+    if (code.isDexCode()) {
+      DexCode dexCode = code.asDexCode();
+      for (Instruction instr : dexCode.instructions) {
+        if (instr instanceof ConstString) {
+          ConstString cnst = (ConstString) instr;
+          DexString dexString = cnst.getString();
+          cnst.BBBB = getRenamedStringLiteral(dexString);
+        } else if (instr instanceof ConstStringJumbo) {
+          ConstStringJumbo cnst = (ConstStringJumbo) instr;
+          DexString dexString = cnst.getString();
+          cnst.BBBBBBBB = getRenamedStringLiteral(dexString);
+        }
+      }
+    } else {
+      assert code.isCfCode();
+      CfCode cfCode = code.asCfCode();
+
+      for (CfInstruction instr : cfCode.getInstructions()) {
+        if (instr instanceof CfConstString) {
+          CfConstString cnst = (CfConstString) instr;
+          DexString dexString = cnst.getString();
+          cnst.setString(getRenamedStringLiteral(dexString));
+        }
       }
     }
   }
@@ -153,19 +166,32 @@
     if (code == null) {
       return;
     }
-    assert code.isDexCode();
-    DexCode dexCode = code.asDexCode();
-    for (Instruction instr : dexCode.instructions) {
-      if (instr instanceof ConstString
-          && ((ConstString) instr).getString() instanceof DexItemBasedString) {
-        ConstString cnst = (ConstString) instr;
-        DexItemBasedString itemBasedString = (DexItemBasedString) cnst.getString();
-        cnst.BBBB = materialize(itemBasedString);
-      } else if (instr instanceof ConstStringJumbo
-          && ((ConstStringJumbo) instr).getString() instanceof DexItemBasedString) {
-        ConstStringJumbo cnst = (ConstStringJumbo) instr;
-        DexItemBasedString itemBasedString = (DexItemBasedString) cnst.getString();
-        cnst.BBBBBBBB = materialize(itemBasedString);
+    if (code.isDexCode()) {
+      DexCode dexCode = code.asDexCode();
+      for (Instruction instr : dexCode.instructions) {
+        if (instr instanceof ConstString
+            && ((ConstString) instr).getString() instanceof DexItemBasedString) {
+          ConstString cnst = (ConstString) instr;
+          DexItemBasedString itemBasedString = (DexItemBasedString) cnst.getString();
+          cnst.BBBB = materialize(itemBasedString);
+        } else if (instr instanceof ConstStringJumbo
+            && ((ConstStringJumbo) instr).getString() instanceof DexItemBasedString) {
+          ConstStringJumbo cnst = (ConstStringJumbo) instr;
+          DexItemBasedString itemBasedString = (DexItemBasedString) cnst.getString();
+          cnst.BBBBBBBB = materialize(itemBasedString);
+        }
+      }
+    } else {
+      assert code.isCfCode();
+      CfCode cfCode = code.asCfCode();
+
+      for (CfInstruction instr : cfCode.getInstructions()) {
+        if (instr instanceof CfConstString
+            && ((CfConstString) instr).getString() instanceof DexItemBasedString) {
+          CfConstString cnst = (CfConstString) instr;
+          DexItemBasedString itemBasedString = (DexItemBasedString) cnst.getString();
+          cnst.setString(materialize(itemBasedString));
+        }
       }
     }
   }
@@ -184,5 +210,4 @@
       return lens.lookupName((DexField) itemBasedString.basedOn);
     }
   }
-
 }
diff --git a/src/test/java/com/android/tools/r8/CfFrontendExamplesTest.java b/src/test/java/com/android/tools/r8/CfFrontendExamplesTest.java
index 4f749b5..70e8445 100644
--- a/src/test/java/com/android/tools/r8/CfFrontendExamplesTest.java
+++ b/src/test/java/com/android/tools/r8/CfFrontendExamplesTest.java
@@ -303,6 +303,7 @@
     R8Command command =
         R8Command.builder()
             .addProgramFiles(inputJar)
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setMode(CompilationMode.DEBUG)
             .setOutput(outputJar, OutputMode.ClassFile)
             .build();
diff --git a/src/test/java/com/android/tools/r8/R8CFExamplesTests.java b/src/test/java/com/android/tools/r8/R8CFExamplesTests.java
index 377bfc0..2dbfb37 100644
--- a/src/test/java/com/android/tools/r8/R8CFExamplesTests.java
+++ b/src/test/java/com/android/tools/r8/R8CFExamplesTests.java
@@ -101,7 +101,7 @@
     Path outputJar = temp.getRoot().toPath().resolve(outputName);
     ToolHelper.runR8(
         R8Command.builder()
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setMode(mode)
             .addProgramFiles(inputJar)
             .setOutput(outputJar, OutputMode.ClassFile)
diff --git a/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
index c773989..f0e758d 100644
--- a/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
@@ -8,8 +8,7 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Path;
@@ -37,7 +36,7 @@
       for (UnaryOperator<R8Command.Builder> transformation : builderTransformations) {
         builder = transformation.apply(builder);
       }
-      builder.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P));
+      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
       R8Command command =
           builder.addProgramFiles(inputFile).setOutput(out, OutputMode.ClassFile).build();
       ToolHelper.runR8(command, this::combinedOptionConsumer);
@@ -62,8 +61,8 @@
       }
 
       if (!dexInspectorChecks.isEmpty()) {
-        DexInspector inspector = new DexInspector(out);
-        for (Consumer<DexInspector> check : dexInspectorChecks) {
+        CodeInspector inspector = new CodeInspector(out);
+        for (Consumer<CodeInspector> check : dexInspectorChecks) {
           check.accept(inspector);
         }
       }
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index 801abae..180a5f8 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -22,7 +22,7 @@
 import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableListMultimap;
@@ -2059,10 +2059,10 @@
 
   private void failWithDexDiff(File originalFile, File processedFile)
       throws IOException, ExecutionException {
-    DexInspector inspectOriginal =
-        new DexInspector(originalFile.toPath().toAbsolutePath());
-    DexInspector inspectProcessed =
-        new DexInspector(processedFile.toPath().toAbsolutePath());
+    CodeInspector inspectOriginal =
+        new CodeInspector(originalFile.toPath().toAbsolutePath());
+    CodeInspector inspectProcessed =
+        new CodeInspector(processedFile.toPath().toAbsolutePath());
     StringBuilder builderOriginal = new StringBuilder();
     StringBuilder builderProcessed = new StringBuilder();
     inspectOriginal.forAllClasses((clazz) -> builderOriginal.append(clazz.dumpMethods()));
@@ -2077,10 +2077,10 @@
     List<ComparisonFailure> errors;
     try {
       // Parse all the verification errors.
-      DexInspector processed = new DexInspector(processedFile.toPath());
-      DexInspector original = DEX_COMPARE_WITH_DEX_REFERENCE_ON_FAILURE
-          ? new DexInspector(referenceFile.toPath())
-          : new DexInspector(inputFiles.stream().map(Paths::get).collect(Collectors.toList()));
+      CodeInspector processed = new CodeInspector(processedFile.toPath());
+      CodeInspector original = DEX_COMPARE_WITH_DEX_REFERENCE_ON_FAILURE
+          ? new CodeInspector(referenceFile.toPath())
+          : new CodeInspector(inputFiles.stream().map(Paths::get).collect(Collectors.toList()));
       List<ArtErrorInfo> errorInfo = ArtErrorParser.parse(verificationError.getMessage());
       errors = ListUtils.map(errorInfo, (error) ->
           new ComparisonFailure(
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
index 36a5fb3..71f4559 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
@@ -12,8 +12,8 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.OffOrAuto;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
@@ -174,7 +174,7 @@
         .run();
   }
 
-  private void checkLambdaCount(DexInspector inspector, int expectedCount, String prefix) {
+  private void checkLambdaCount(CodeInspector inspector, int expectedCount, String prefix) {
     int count = 0;
     for (FoundClassSubject clazz : inspector.allClasses()) {
       if (clazz.isSynthesizedJavaLambdaClass() &&
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesCommon.java b/src/test/java/com/android/tools/r8/R8RunExamplesCommon.java
index 3d3b4e7..008c6b9 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesCommon.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesCommon.java
@@ -161,11 +161,15 @@
         break;
       }
       case R8: {
-        R8Command command =
-            addInputFile(R8Command.builder())
-                .setOutput(getOutputFile(), outputMode)
-                .setMode(mode)
-                .build();
+          R8Command command =
+              addInputFile(R8Command.builder())
+                  .addLibraryFiles(
+                      output == Output.CF
+                          ? ToolHelper.getJava8RuntimeJar()
+                          : ToolHelper.getDefaultAndroidJar())
+                  .setOutput(getOutputFile(), outputMode)
+                  .setMode(mode)
+                  .build();
         ExceptionUtils.withR8CompilationHandler(
             command.getReporter(),
             () ->
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
index 2a17917..f638575 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
@@ -17,11 +17,11 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.OffOrAuto;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
-import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.ByteStreams;
@@ -62,7 +62,7 @@
     AndroidApiLevel androidJarVersion = null;
 
     final List<Consumer<InternalOptions>> optionConsumers = new ArrayList<>();
-    final List<Consumer<DexInspector>> dexInspectorChecks = new ArrayList<>();
+    final List<Consumer<CodeInspector>> dexInspectorChecks = new ArrayList<>();
     final List<UnaryOperator<B>> builderTransformations = new ArrayList<>();
 
     TestRunner(String testName, String packageName, String mainClass) {
@@ -73,7 +73,7 @@
 
     abstract C self();
 
-    C withDexCheck(Consumer<DexInspector> check) {
+    C withDexCheck(Consumer<CodeInspector> check) {
       dexInspectorChecks.add(check);
       return self();
     }
@@ -155,8 +155,8 @@
       }
 
       if (!dexInspectorChecks.isEmpty()) {
-        DexInspector inspector = new DexInspector(out);
-        for (Consumer<DexInspector> check : dexInspectorChecks) {
+        CodeInspector inspector = new CodeInspector(out);
+        for (Consumer<CodeInspector> check : dexInspectorChecks) {
           check.accept(inspector);
         }
       }
@@ -495,10 +495,10 @@
             mainDexClasses);
 
     // Collect main dex types.
-    DexInspector fullInspector =  getMainDexInspector(fullDexes);
-    DexInspector indexedIntermediateInspector =
+    CodeInspector fullInspector =  getMainDexInspector(fullDexes);
+    CodeInspector indexedIntermediateInspector =
         getMainDexInspector(dexesThroughIndexedIntermediate);
-    DexInspector filePerInputClassIntermediateInspector =
+    CodeInspector filePerInputClassIntermediateInspector =
         getMainDexInspector(dexesThroughFilePerInputClassIntermediate);
     Collection<String> fullMainClasses = new HashSet<>();
     fullInspector.forAllClasses(
@@ -578,12 +578,12 @@
     }
   }
 
-  protected DexInspector getMainDexInspector(Path zip)
+  protected CodeInspector getMainDexInspector(Path zip)
       throws ZipException, IOException, ExecutionException {
     try (ZipFile zipFile = new ZipFile(zip.toFile(), StandardCharsets.UTF_8)) {
       try (InputStream in =
           zipFile.getInputStream(zipFile.getEntry(ToolHelper.DEFAULT_DEX_FILENAME))) {
-        return new DexInspector(
+        return new CodeInspector(
             AndroidApp.builder()
                 .addDexProgramData(ByteStreams.toByteArray(in), Origin.unknown())
                 .build());
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
index aa17280..7f15eca 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
@@ -16,10 +16,10 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.OffOrAuto;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
-import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.ByteStreams;
@@ -57,7 +57,7 @@
     Integer androidJarVersion = null;
 
     final List<Consumer<InternalOptions>> optionConsumers = new ArrayList<>();
-    final List<Consumer<DexInspector>> dexInspectorChecks = new ArrayList<>();
+    final List<Consumer<CodeInspector>> dexInspectorChecks = new ArrayList<>();
     final List<UnaryOperator<B>> builderTransformations = new ArrayList<>();
 
     TestRunner(String testName, String packageName, String mainClass) {
@@ -68,7 +68,7 @@
 
     abstract C self();
 
-    C withDexCheck(Consumer<DexInspector> check) {
+    C withDexCheck(Consumer<CodeInspector> check) {
       dexInspectorChecks.add(check);
       return self();
     }
@@ -150,8 +150,8 @@
       }
 
       if (!dexInspectorChecks.isEmpty()) {
-        DexInspector inspector = new DexInspector(out);
-        for (Consumer<DexInspector> check : dexInspectorChecks) {
+        CodeInspector inspector = new CodeInspector(out);
+        for (Consumer<CodeInspector> check : dexInspectorChecks) {
           check.accept(inspector);
         }
       }
@@ -255,12 +255,12 @@
     }
   }
 
-  protected DexInspector getMainDexInspector(Path zip)
+  protected CodeInspector getMainDexInspector(Path zip)
       throws ZipException, IOException, ExecutionException {
     try (ZipFile zipFile = new ZipFile(zip.toFile(), StandardCharsets.UTF_8)) {
       try (InputStream in =
           zipFile.getInputStream(zipFile.getEntry(ToolHelper.DEFAULT_DEX_FILENAME))) {
-        return new DexInspector(
+        return new CodeInspector(
             AndroidApp.builder()
                 .addDexProgramData(ByteStreams.toByteArray(in), Origin.unknown())
                 .build());
diff --git a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
index d1894fb..f149cba 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
@@ -6,7 +6,7 @@
 
 import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
 import static com.android.tools.r8.utils.FileUtils.ZIP_EXTENSION;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -17,12 +17,12 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.OffOrAuto;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
-import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.io.IOException;
@@ -54,7 +54,7 @@
     Integer androidJarVersion = null;
 
     final List<Consumer<InternalOptions>> optionConsumers = new ArrayList<>();
-    final List<Consumer<DexInspector>> dexInspectorChecks = new ArrayList<>();
+    final List<Consumer<CodeInspector>> dexInspectorChecks = new ArrayList<>();
     final List<UnaryOperator<B>> builderTransformations = new ArrayList<>();
 
     TestRunner(String testName, String packageName, String mainClass) {
@@ -65,7 +65,7 @@
 
     abstract C self();
 
-    C withDexCheck(Consumer<DexInspector> check) {
+    C withDexCheck(Consumer<CodeInspector> check) {
       dexInspectorChecks.add(check);
       return self();
     }
@@ -147,8 +147,8 @@
       }
 
       if (!dexInspectorChecks.isEmpty()) {
-        DexInspector inspector = new DexInspector(out);
-        for (Consumer<DexInspector> check : dexInspectorChecks) {
+        CodeInspector inspector = new CodeInspector(out);
+        for (Consumer<CodeInspector> check : dexInspectorChecks) {
           check.accept(inspector);
         }
       }
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 2d951fa..d5ef221 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -25,9 +25,9 @@
 import com.android.tools.r8.utils.PreloadedClassFileProvider;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
 import com.android.tools.r8.utils.ZipUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
@@ -533,6 +533,25 @@
     return result.stdout;
   }
 
+  /** Run application on Java with the specified main class and provided arguments. */
+  protected String runOnJava(AndroidApp app, Class mainClass, String... args) throws IOException {
+    return runOnJava(app, mainClass, Arrays.asList(args));
+  }
+
+  /** Run application on Java with the specified main class and provided arguments. */
+  protected String runOnJava(AndroidApp app, Class mainClass, List<String> args)
+      throws IOException {
+    return runOnJava(app, mainClass.getCanonicalName(), args);
+  }
+
+  /** Run application on Java with the specified main class and provided arguments. */
+  protected String runOnJava(AndroidApp app, String mainClass, List<String> args)
+      throws IOException {
+    Path out = File.createTempFile("junit", ".zip", temp.getRoot()).toPath();
+    app.writeToZip(out, OutputMode.ClassFile);
+    return ToolHelper.runJava(out, mainClass).stdout;
+  }
+
   protected ProcessResult runOnJavaRaw(String main, byte[]... classes) throws IOException {
     return runOnJavaRaw(main, Arrays.asList(classes));
   }
@@ -580,7 +599,7 @@
   }
 
   protected DexEncodedMethod getMethod(
-      DexInspector inspector,
+      CodeInspector inspector,
       String className,
       String returnType,
       String methodName,
@@ -599,7 +618,7 @@
       String methodName,
       List<String> parameters) {
     try {
-      DexInspector inspector = new DexInspector(application);
+      CodeInspector inspector = new CodeInspector(application);
       return getMethod(inspector, className, returnType, methodName, parameters);
     } catch (Exception e) {
       return null;
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 2767df7..2499b5f 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -533,6 +533,10 @@
     return getArtDir(version) + "/" + binary;
   }
 
+  public static Path getJava8RuntimeJar() {
+    return Paths.get(JAVA_8_RUNTIME);
+  }
+
   public static Path getDefaultAndroidJar() {
     return getAndroidJar(AndroidApiLevel.getDefault());
   }
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java
index 706b50b..80541e8 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.accessrelaxation;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPublic;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPublic;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
@@ -16,9 +16,9 @@
 import com.android.tools.r8.VmTestRunner;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import org.junit.runner.RunWith;
 
 @RunWith(VmTestRunner.class)
@@ -57,15 +57,15 @@
     assertEquals(jvmOutput, adjustedArtOutput);
   }
 
-  static void assertPublic(DexInspector dexInspector, Class clazz, MethodSignature signature) {
-    ClassSubject classSubject = dexInspector.clazz(clazz);
+  static void assertPublic(CodeInspector codeInspector, Class clazz, MethodSignature signature) {
+    ClassSubject classSubject = codeInspector.clazz(clazz);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method(signature);
     assertThat(methodSubject, isPublic());
   }
 
-  static void assertNotPublic(DexInspector dexInspector, Class clazz, MethodSignature signature) {
-    ClassSubject classSubject = dexInspector.clazz(clazz);
+  static void assertNotPublic(CodeInspector codeInspector, Class clazz, MethodSignature signature) {
+    ClassSubject classSubject = codeInspector.clazz(clazz);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method(signature);
     assertThat(methodSubject, not(isPublic()));
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java
index 713c467..d90ae45 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.accessrelaxation;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
@@ -11,8 +11,8 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import java.util.List;
@@ -185,9 +185,9 @@
     });
     compareJvmAndArt(app, mainClass);
 
-    DexInspector dexInspector = new DexInspector(app);
+    CodeInspector codeInspector = new CodeInspector(app);
     for (Class clazz : CLASSES) {
-      ClassSubject classSubject = dexInspector.clazz(clazz);
+      ClassSubject classSubject = codeInspector.clazz(clazz);
       assertThat(classSubject, isPresent());
       classSubject.getDexClass().forEachMethod(m -> {
         assertTrue(!m.isInstanceInitializer() || m.isPublicMethod());
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
index 4459699..787568b 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.accessrelaxation;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -24,8 +24,8 @@
 import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import java.util.function.Consumer;
@@ -62,7 +62,7 @@
   private void run(
       SmaliBuilder builder,
       String expectedException,
-      Consumer<DexInspector> inspectorConsumer) throws Exception {
+      Consumer<CodeInspector> inspectorConsumer) throws Exception {
     AndroidApp app = buildApplication(builder);
     List<String> pgConfigs = ImmutableList.of(
         keepMainProguardConfiguration(CLASS_NAME),
@@ -82,7 +82,7 @@
       assertEquals(1, artResult.exitCode);
       assertThat(artResult.stderr, containsString(expectedException));
     }
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     inspectorConsumer.accept(inspector);
   }
 
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
index 9bfd4e2..5b641dc 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
@@ -18,7 +18,7 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
@@ -62,20 +62,20 @@
     AndroidApp app = ToolHelper.runR8(builder.build());
     compareJvmAndArt(app, mainClass);
 
-    DexInspector dexInspector = new DexInspector(app);
-    assertPublic(dexInspector, A.class,
+    CodeInspector codeInspector = new CodeInspector(app);
+    assertPublic(codeInspector, A.class,
         new MethodSignature("baz", STRING, ImmutableList.of()));
-    assertPublic(dexInspector, A.class,
+    assertPublic(codeInspector, A.class,
         new MethodSignature("bar", STRING, ImmutableList.of()));
-    assertPublic(dexInspector, A.class,
+    assertPublic(codeInspector, A.class,
         new MethodSignature("bar", STRING, ImmutableList.of("int")));
-    assertPublic(dexInspector, A.class,
+    assertPublic(codeInspector, A.class,
         new MethodSignature("blah", STRING, ImmutableList.of("int")));
 
-    assertPublic(dexInspector, B.class,
+    assertPublic(codeInspector, B.class,
         new MethodSignature("blah", STRING, ImmutableList.of("int")));
 
-    assertPublic(dexInspector, BB.class,
+    assertPublic(codeInspector, BB.class,
         new MethodSignature("blah", STRING, ImmutableList.of("int")));
   }
 
@@ -110,24 +110,24 @@
     AndroidApp app = ToolHelper.runR8(builder.build());
     compareJvmAndArt(app, mainClass);
 
-    DexInspector dexInspector = new DexInspector(app);
-    assertPublic(dexInspector, Base.class,
+    CodeInspector codeInspector = new CodeInspector(app);
+    assertPublic(codeInspector, Base.class,
         new MethodSignature("foo", STRING, ImmutableList.of()));
 
     // Base#foo?() can't be publicized due to Itf<1>#foo<1>().
-    assertNotPublic(dexInspector, Base.class,
+    assertNotPublic(codeInspector, Base.class,
         new MethodSignature("foo1", STRING, ImmutableList.of()));
-    assertNotPublic(dexInspector, Base.class,
+    assertNotPublic(codeInspector, Base.class,
         new MethodSignature("foo2", STRING, ImmutableList.of()));
 
     // Sub?#bar1(int) can be publicized as they don't bother each other.
-    assertPublic(dexInspector, Sub1.class,
+    assertPublic(codeInspector, Sub1.class,
         new MethodSignature("bar1", STRING, ImmutableList.of("int")));
-    assertPublic(dexInspector, Sub2.class,
+    assertPublic(codeInspector, Sub2.class,
         new MethodSignature("bar1", STRING, ImmutableList.of("int")));
 
     // Sub2#bar2(int) is unique throughout the hierarchy, hence publicized.
-    assertPublic(dexInspector, Sub2.class,
+    assertPublic(codeInspector, Sub2.class,
         new MethodSignature("bar2", STRING, ImmutableList.of("int")));
   }
 }
diff --git a/src/test/java/com/android/tools/r8/bisect/BisectTest.java b/src/test/java/com/android/tools/r8/bisect/BisectTest.java
index a692b9e..5252f08 100644
--- a/src/test/java/com/android/tools/r8/bisect/BisectTest.java
+++ b/src/test/java/com/android/tools/r8/bisect/BisectTest.java
@@ -16,7 +16,7 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -81,7 +81,7 @@
   }
 
   private Result command(DexApplication application) {
-    DexInspector inspector = new DexInspector(application);
+    CodeInspector inspector = new CodeInspector(application);
     if (inspector
         .clazz(ERRONEOUS_CLASS)
         .method(erroneousMethodSignature.returnType,
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java b/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
index 77b251d..37d3914 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.bridgeremoval;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -16,9 +16,9 @@
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
@@ -129,7 +129,7 @@
 
     AndroidApp processedApp = runAndVerifyOnJvmAndArt(jasminBuilder, mainClassName, proguardConfig);
 
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject absSubject = inspector.clazz(absCls.name);
     assertThat(absSubject, isPresent());
     ClassSubject cls1Subject = inspector.clazz(cls1.name);
@@ -236,7 +236,7 @@
 
     AndroidApp processedApp = runAndVerifyOnJvmAndArt(jasminBuilder, mainClassName, proguardConfig);
 
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject baseSubject = inspector.clazz(baseCls.name);
     assertThat(baseSubject, isPresent());
     ClassSubject cls1Subject = inspector.clazz(cls1.name);
@@ -332,7 +332,7 @@
 
     AndroidApp processedApp = runAndVerifyOnJvmAndArt(jasminBuilder, mainClassName, proguardConfig);
 
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject baseSubject = inspector.clazz(baseCls.name);
     assertThat(baseSubject, isPresent());
     ClassSubject subSubject = inspector.clazz(subCls.name);
@@ -408,7 +408,7 @@
     String proguardConfig = keepMainProguardConfiguration(mainClass.name, false, false);
     AndroidApp processedApp = runAndVerifyOnJvmAndArt(jasminBuilder, mainClassName, proguardConfig);
 
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject baseSubject = inspector.clazz(cls.name);
     assertThat(baseSubject, isPresent());
 
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/EmptyBridgeTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/EmptyBridgeTest.java
index 8fcf7a3..9c525b5 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/EmptyBridgeTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/EmptyBridgeTest.java
@@ -3,16 +3,16 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.bridgeremoval;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
@@ -53,7 +53,7 @@
             + "-keep class " + absClassName + "{ *; }";
     AndroidApp processedApp = compileWithR8(jasminBuilder.build(), proguardConfig);
 
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject classSubject = inspector.clazz(absClassName);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method("void", "emptyBridge", ImmutableList.of());
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/RemoveVisibilityBridgeMethodsTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/RemoveVisibilityBridgeMethodsTest.java
index 272406f..c19b308 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/RemoveVisibilityBridgeMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/RemoveVisibilityBridgeMethodsTest.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.bridgeremoval;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
@@ -17,9 +17,9 @@
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Method;
 import java.nio.file.Path;
@@ -34,7 +34,7 @@
         Outer.class,
         Main.class);
     String proguardConfig = keepMainProguardConfiguration(Main.class, true, obfuscate);
-    DexInspector inspector = new DexInspector(compileWithR8(classes, proguardConfig));
+    CodeInspector inspector = new CodeInspector(compileWithR8(classes, proguardConfig));
 
     List<Method> removedMethods = ImmutableList.of(
         Outer.SubClass.class.getMethod("method"),
@@ -116,7 +116,7 @@
     String artResult = runOnArt(optimizedApp, mainClassName);
     assertEquals(javaResult.stdout, artResult);
 
-    DexInspector inspector = new DexInspector(optimizedApp);
+    CodeInspector inspector = new CodeInspector(optimizedApp);
 
     ClassSubject classSubject = inspector.clazz(superClass.name);
     assertThat(classSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java
index f1eddcd..4535b6f 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java
@@ -7,8 +7,8 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Method;
 import java.util.List;
@@ -32,7 +32,7 @@
         SimpleObservableList.class,
         Main.class);
     String proguardConfig = keepMainAllowAccessModification(Main.class, obfuscate);
-    DexInspector inspector = new DexInspector(compileWithR8(classes, proguardConfig));
+    CodeInspector inspector = new CodeInspector(compileWithR8(classes, proguardConfig));
 
     // The bridge for registerObserver cannot be removed.
     Method registerObserver =
diff --git a/src/test/java/com/android/tools/r8/cf/BootstrapTest.java b/src/test/java/com/android/tools/r8/cf/BootstrapTest.java
index 7fdad0d..90b64900 100644
--- a/src/test/java/com/android/tools/r8/cf/BootstrapTest.java
+++ b/src/test/java/com/android/tools/r8/cf/BootstrapTest.java
@@ -102,7 +102,7 @@
     ToolHelper.runR8(
         R8Command.builder()
             .setMode(mode)
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setProgramConsumer(new ClassFileConsumer.ArchiveConsumer(outputJar, true))
             .addProgramFiles(inputJar)
             .addProguardConfigurationFiles(pgConfigFile)
diff --git a/src/test/java/com/android/tools/r8/cf/IdenticalCatchHandlerTest.java b/src/test/java/com/android/tools/r8/cf/IdenticalCatchHandlerTest.java
index d285dc6..450e6d0 100644
--- a/src/test/java/com/android/tools/r8/cf/IdenticalCatchHandlerTest.java
+++ b/src/test/java/com/android/tools/r8/cf/IdenticalCatchHandlerTest.java
@@ -19,11 +19,10 @@
 import com.android.tools.r8.graph.DexCode.Try;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.Sets;
 import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
 import it.unimi.dsi.fastutil.ints.IntSet;
-import java.nio.file.Paths;
 import java.util.Set;
 import org.junit.Test;
 
@@ -52,7 +51,7 @@
     AndroidApp inputApp =
         AndroidApp.builder()
             .addClassProgramData(inputBytes, Origin.unknown())
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .build();
     assertEquals(2, countCatchHandlers(inputApp));
     AndroidApp outputDexApp = ToolHelper.runR8(inputApp);
@@ -64,7 +63,7 @@
   }
 
   private int countCatchHandlers(AndroidApp inputApp) throws Exception {
-    DexInspector inspector = new DexInspector(inputApp, o -> o.enableCfFrontend = true);
+    CodeInspector inspector = new CodeInspector(inputApp, o -> o.enableCfFrontend = true);
     DexClass dexClass = inspector.clazz(TestClass.class).getDexClass();
     Code code = dexClass.virtualMethods()[0].getCode();
     if (code.isCfCode()) {
diff --git a/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java b/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java
index e1d110c..7db1d61 100644
--- a/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java
@@ -18,9 +18,8 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.Collections;
 import java.util.List;
 import org.junit.Assert;
@@ -52,7 +51,7 @@
     R8.run(
         R8Command.builder()
             .setMode(CompilationMode.DEBUG)
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setProgramConsumer(appBuilder.wrapClassFileConsumer(new ArchiveConsumer(outPath)))
             .addClassProgramData(inputClass, Origin.unknown())
             .build());
@@ -70,7 +69,7 @@
 
   private static CfInvokeDynamic findFirstInMethod(AndroidApp app) throws Exception {
     String returnType = "void";
-    DexInspector inspector = new DexInspector(app, o -> o.enableCfFrontend = true);
+    CodeInspector inspector = new CodeInspector(app, o -> o.enableCfFrontend = true);
     List<String> args = Collections.singletonList(String[].class.getTypeName());
     DexEncodedMethod method = inspector.clazz(CLASS).method(returnType, METHOD, args).getMethod();
     CfCode code = method.getCode().asCfCode();
diff --git a/src/test/java/com/android/tools/r8/cf/NestedExceptionTestRunner.java b/src/test/java/com/android/tools/r8/cf/NestedExceptionTestRunner.java
index c0a5455..a60eda9 100644
--- a/src/test/java/com/android/tools/r8/cf/NestedExceptionTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/NestedExceptionTestRunner.java
@@ -29,7 +29,7 @@
         R8Command.builder()
             .setMode(CompilationMode.DEBUG)
             .addClassProgramData(ToolHelper.getClassAsBytes(CLASS), Origin.unknown())
-            .addLibraryFiles(ToolHelper.getAndroidJar(ToolHelper.getMinApiLevelForDexVm()))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setProgramConsumer(sink.wrapClassFileConsumer(null))
             .build());
     Path out = temp.newFolder().toPath().resolve("test.jar");
diff --git a/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java b/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java
index 6196081..e4f9249 100644
--- a/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java
@@ -15,7 +15,7 @@
 import com.android.tools.r8.graph.JarCode;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidAppConsumers;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.util.ArrayList;
 import java.util.Collections;
 import org.junit.Test;
@@ -37,7 +37,7 @@
             .addLibraryFiles(ToolHelper.getAndroidJar(ToolHelper.getMinApiLevelForDexVm()))
             .setProgramConsumer(a.wrapClassFileConsumer(null))
             .build());
-    DexInspector inspector = new DexInspector(a.build());
+    CodeInspector inspector = new CodeInspector(a.build());
     DexEncodedMethod method =
         inspector.clazz(CLASS).method("void", "noop", Collections.emptyList()).getMethod();
     ArrayList<AbstractInsnNode> insns = new ArrayList<>();
diff --git a/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
index 91e7b5d..6f3c97a 100644
--- a/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.classmerging;
 
 import static com.android.tools.r8.smali.SmaliBuilder.buildCode;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -30,10 +30,10 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
@@ -83,11 +83,11 @@
             .setDisableMinification(true)
             .build(),
         optionsConsumer);
-    inspector = new DexInspector(
+    inspector = new CodeInspector(
         Paths.get(temp.getRoot().getCanonicalPath()).resolve("classes.dex"));
   }
 
-  private DexInspector inspector;
+  private CodeInspector inspector;
 
   private final List<String> CAN_BE_MERGED = ImmutableList.of(
       "classmerging.GenericInterface",
@@ -152,7 +152,7 @@
         ImmutableSet.of(
             "classmerging.ConflictInGeneratedNameTest",
             "classmerging.ConflictInGeneratedNameTest$B");
-    DexInspector inspector =
+    CodeInspector inspector =
         runTestOnInput(
             main,
             readProgramFiles(programFiles),
@@ -603,7 +603,7 @@
             "classmerging.ExceptionTest",
             "classmerging.ExceptionTest$ExceptionB",
             "classmerging.ExceptionTest$Exception2");
-    DexInspector inspector = runTest(main, programFiles, preservedClassNames::contains);
+    CodeInspector inspector = runTest(main, programFiles, preservedClassNames::contains);
 
     ClassSubject mainClass = inspector.clazz(main);
     assertThat(mainClass, isPresent());
@@ -645,7 +645,7 @@
     // Sanity check that there is actually an invoke-interface instruction in the input. We need
     // to make sure that this invoke-interface instruction is translated to invoke-virtual after
     // the classes A and B are merged.
-    DexInspector inputInspector = new DexInspector(app);
+    CodeInspector inputInspector = new CodeInspector(app);
     ClassSubject clazz = inputInspector.clazz("classmerging.MergeDefaultMethodIntoClassTest");
     assertThat(clazz, isPresent());
     MethodSubject method = clazz.method("void", "main", ImmutableList.of("java.lang.String[]"));
@@ -773,12 +773,12 @@
     runTest(main, programFiles, preservedClassNames::contains);
   }
 
-  private DexInspector runTest(
+  private CodeInspector runTest(
       String main, Path[] programFiles, Predicate<String> preservedClassNames) throws Exception {
     return runTest(main, programFiles, preservedClassNames, getProguardConfig(EXAMPLE_KEEP));
   }
 
-  private DexInspector runTest(
+  private CodeInspector runTest(
       String main,
       Path[] programFiles,
       Predicate<String> preservedClassNames,
@@ -788,13 +788,13 @@
         main, readProgramFiles(programFiles), preservedClassNames, proguardConfig);
   }
 
-  private DexInspector runTestOnInput(
+  private CodeInspector runTestOnInput(
       String main, AndroidApp input, Predicate<String> preservedClassNames, String proguardConfig)
       throws Exception {
     return runTestOnInput(main, input, preservedClassNames, proguardConfig, this::configure);
   }
 
-  private DexInspector runTestOnInput(
+  private CodeInspector runTestOnInput(
       String main,
       AndroidApp input,
       Predicate<String> preservedClassNames,
@@ -802,8 +802,8 @@
       Consumer<InternalOptions> optionsConsumer)
       throws Exception {
     AndroidApp output = compileWithR8(input, proguardConfig, optionsConsumer);
-    DexInspector inputInspector = new DexInspector(input);
-    DexInspector outputInspector = new DexInspector(output);
+    CodeInspector inputInspector = new CodeInspector(input);
+    CodeInspector outputInspector = new CodeInspector(output);
     // Check that all classes in [preservedClassNames] are in fact preserved.
     for (FoundClassSubject classSubject : inputInspector.allClasses()) {
       String className = classSubject.getOriginalName();
diff --git a/src/test/java/com/android/tools/r8/code/NativeMethodWithCodeTest.java b/src/test/java/com/android/tools/r8/code/NativeMethodWithCodeTest.java
index d524d7c..5b4f1d4 100644
--- a/src/test/java/com/android/tools/r8/code/NativeMethodWithCodeTest.java
+++ b/src/test/java/com/android/tools/r8/code/NativeMethodWithCodeTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
@@ -17,9 +17,9 @@
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Path;
@@ -102,7 +102,7 @@
 
   private MethodSubject getNativeMethod(String mainClassName, AndroidApp processedApp)
       throws IOException, ExecutionException {
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject mainSubject = inspector.clazz(mainClassName);
     return mainSubject.method("void", "n1", ImmutableList.of("java.lang.String"));
   }
diff --git a/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java b/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java
index 7d27c5e..2521e02 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java
@@ -12,9 +12,9 @@
 import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -44,11 +44,11 @@
         keepMainProguardConfiguration(CLASS_NAME),
         "-dontshrink",
         "-dontoptimize");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
@@ -80,11 +80,11 @@
         keepMainProguardConfiguration(CLASS_NAME),
         "-dontshrink",
         "-dontoptimize");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
@@ -117,11 +117,11 @@
         keepMainProguardConfiguration(CLASS_NAME),
         "-dontshrink",
         "-dontoptimize");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
diff --git a/src/test/java/com/android/tools/r8/compatproguard/CompatProguardSmaliTestBase.java b/src/test/java/com/android/tools/r8/compatproguard/CompatProguardSmaliTestBase.java
index 0d5849b..ea450e4 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/CompatProguardSmaliTestBase.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/CompatProguardSmaliTestBase.java
@@ -10,12 +10,12 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.smali.SmaliTestBase;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.nio.file.Path;
 import java.util.List;
 
 class CompatProguardSmaliTestBase extends SmaliTestBase {
-  DexInspector runCompatProguard(SmaliBuilder builder, List<String> proguardConfigurations)
+  CodeInspector runCompatProguard(SmaliBuilder builder, List<String> proguardConfigurations)
       throws Exception {
     Path dexOutputDir = temp.newFolder().toPath();
     R8Command.Builder commandBuilder =
@@ -23,6 +23,6 @@
             .setOutput(dexOutputDir, OutputMode.DexIndexed)
             .addProguardConfiguration(proguardConfigurations, Origin.unknown());
     ToolHelper.getAppBuilder(commandBuilder).addDexProgramData(builder.compile(), Origin.unknown());
-    return new DexInspector(ToolHelper.runR8(commandBuilder.build()));
+    return new CodeInspector(ToolHelper.runR8(commandBuilder.build()));
   }
 }
diff --git a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
index 3d9c912..6aa8805 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
@@ -12,9 +12,9 @@
 import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -39,11 +39,11 @@
         keepMainProguardConfiguration(CLASS_NAME),
         "-dontshrink",
         "-dontoptimize");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
@@ -70,11 +70,11 @@
         "-dontshrink",
         "-dontoptimize",
         "-dontobfuscate");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
diff --git a/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java b/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java
index e478115..5771019 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java
@@ -15,9 +15,9 @@
 import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -45,11 +45,11 @@
         keepMainProguardConfiguration(CLASS_NAME),
         "-dontshrink",
         "-dontoptimize");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
@@ -85,11 +85,11 @@
         keepMainProguardConfiguration(CLASS_NAME),
         "-dontshrink",
         "-dontoptimize");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
diff --git a/src/test/java/com/android/tools/r8/debug/ArrayDimensionGreaterThanSevenTestRunner.java b/src/test/java/com/android/tools/r8/debug/ArrayDimensionGreaterThanSevenTestRunner.java
index 7866e1b..bcc70c6 100644
--- a/src/test/java/com/android/tools/r8/debug/ArrayDimensionGreaterThanSevenTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/ArrayDimensionGreaterThanSevenTestRunner.java
@@ -36,6 +36,7 @@
         R8Command.builder()
             .addClassProgramData(ToolHelper.getClassAsBytes(CLASS), Origin.unknown())
             .setMode(CompilationMode.DEBUG)
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setOutput(cfOut, OutputMode.ClassFile)
             .build(),
         optionsConsumer);
diff --git a/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java b/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java
index f010357..29b0e17 100644
--- a/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java
+++ b/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java
@@ -55,7 +55,9 @@
       config = new DexDebugTestConfig(outjar);
     } else {
       assert (runtimeKind == RuntimeKind.CF);
-      builder.setOutput(outjar, OutputMode.ClassFile);
+      builder
+          .setOutput(outjar, OutputMode.ClassFile)
+          .addLibraryFiles(ToolHelper.getJava8RuntimeJar());
       config = new CfDebugTestConfig(outjar);
     }
 
diff --git a/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java b/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java
index 6de20c6..6dccf0b 100644
--- a/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java
@@ -51,6 +51,7 @@
     ToolHelper.runR8(
         R8Command.builder()
             .addProgramFiles(input)
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setMode(CompilationMode.DEBUG)
             .setOutput(output, OutputMode.ClassFile)
             .build(),
diff --git a/src/test/java/com/android/tools/r8/debug/IincDebugTestRunner.java b/src/test/java/com/android/tools/r8/debug/IincDebugTestRunner.java
index bc390b9..a275e6b 100644
--- a/src/test/java/com/android/tools/r8/debug/IincDebugTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/IincDebugTestRunner.java
@@ -17,7 +17,6 @@
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.debug.DebugTestBase.JUnit3Wrapper.DebuggeeState;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.stream.Stream;
 import org.junit.Assume;
 import org.junit.Test;
@@ -115,7 +114,7 @@
             .setProgramConsumer(consumer)
             .addProgramFiles(inputJar);
     if ((consumer instanceof ClassFileConsumer)) {
-      builder.addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME));
+      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
     } else {
       builder.addLibraryFiles(ToolHelper.getAndroidJar(ToolHelper.getMinApiLevelForDexVm()));
     }
diff --git a/src/test/java/com/android/tools/r8/debug/LineNumberOptimizationTest.java b/src/test/java/com/android/tools/r8/debug/LineNumberOptimizationTest.java
index 6e1c05f..5cbe03d 100644
--- a/src/test/java/com/android/tools/r8/debug/LineNumberOptimizationTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LineNumberOptimizationTest.java
@@ -60,7 +60,9 @@
     DebugTestConfig config = null;
 
     if (runtimeKind == RuntimeKind.CF) {
-      builder.setOutput(outjar, OutputMode.ClassFile);
+      builder
+          .setOutput(outjar, OutputMode.ClassFile)
+          .addLibraryFiles(ToolHelper.getJava8RuntimeJar());
       config = new CfDebugTestConfig(outjar);
     } else {
       assert (runtimeKind == RuntimeKind.DEX);
diff --git a/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java b/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java
index d0f9d20..09a46e5 100644
--- a/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java
@@ -7,9 +7,9 @@
 
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.jasmin.JasminBuilder;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.Collections;
@@ -53,8 +53,8 @@
   }
 
   private void runTest(DebugTestConfig config) throws Throwable {
-    DexInspector inspector =
-        new DexInspector(
+    CodeInspector inspector =
+        new CodeInspector(
             (config instanceof CfDebugTestConfig)
                 ? Collections.singletonList(config.getPaths().get(1).resolve(className + ".class"))
                 : config.getPaths());
diff --git a/src/test/java/com/android/tools/r8/debug/MinificationTest.java b/src/test/java/com/android/tools/r8/debug/MinificationTest.java
index 1bb357f..1b51cd8 100644
--- a/src/test/java/com/android/tools/r8/debug/MinificationTest.java
+++ b/src/test/java/com/android/tools/r8/debug/MinificationTest.java
@@ -16,8 +16,8 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.Collection;
@@ -80,7 +80,6 @@
       proguardConfigurations = builder.build();
     }
 
-    AndroidApiLevel minSdk = ToolHelper.getMinApiLevelForDexVm();
     Path outputPath = temp.getRoot().toPath().resolve("classes.zip");
     Path proguardMap = writeProguardMap ? temp.getRoot().toPath().resolve("proguard.map") : null;
     OutputMode outputMode =
@@ -89,10 +88,12 @@
         R8Command.builder()
             .addProgramFiles(DEBUGGEE_JAR)
             .setOutput(outputPath, outputMode)
-            .setMode(CompilationMode.DEBUG)
-            .addLibraryFiles(ToolHelper.getAndroidJar(minSdk));
-    if (runtimeKind != RuntimeKind.CF) {
-      builder.setMinApiLevel(minSdk.getLevel());
+            .setMode(CompilationMode.DEBUG);
+    if (runtimeKind == RuntimeKind.DEX) {
+      AndroidApiLevel minSdk = ToolHelper.getMinApiLevelForDexVm();
+      builder.setMinApiLevel(minSdk.getLevel()).addLibraryFiles(ToolHelper.getAndroidJar(minSdk));
+    } else if (runtimeKind == RuntimeKind.CF) {
+      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
     }
     if (proguardMap != null) {
       builder.setProguardMapOutputPath(proguardMap);
@@ -187,7 +188,7 @@
       throws Throwable {
     Path proguardMap = config.getProguardMap();
     String mappingFile = proguardMap == null ? null : proguardMap.toString();
-    DexInspector inspector = new DexInspector(config.getPaths(), mappingFile);
+    CodeInspector inspector = new CodeInspector(config.getPaths(), mappingFile);
     ClassSubject clazz = inspector.clazz(className);
     assertTrue(clazz.isPresent());
     if (method != null) {
diff --git a/src/test/java/com/android/tools/r8/debug/NopDebugTestRunner.java b/src/test/java/com/android/tools/r8/debug/NopDebugTestRunner.java
index 3ea4017..813a873 100644
--- a/src/test/java/com/android/tools/r8/debug/NopDebugTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/NopDebugTestRunner.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.debug.DebugTestBase.JUnit3Wrapper.DebuggeeState;
 import com.android.tools.r8.utils.DescriptorUtils;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.stream.Stream;
 import org.junit.Assume;
 import org.junit.Test;
@@ -47,7 +46,7 @@
     Path outputJar = temp.getRoot().toPath().resolve(outputName);
     ToolHelper.runR8(
         R8Command.builder()
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setMode(CompilationMode.DEBUG)
             .addProgramFiles(inputJar)
             .setOutput(outputJar, OutputMode.ClassFile)
diff --git a/src/test/java/com/android/tools/r8/debug/R8CfDebugTestResourcesConfig.java b/src/test/java/com/android/tools/r8/debug/R8CfDebugTestResourcesConfig.java
index e4a88f0..67b7c1a 100644
--- a/src/test/java/com/android/tools/r8/debug/R8CfDebugTestResourcesConfig.java
+++ b/src/test/java/com/android/tools/r8/debug/R8CfDebugTestResourcesConfig.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
 import java.nio.file.Path;
@@ -21,14 +20,13 @@
 
   private static synchronized AndroidApp getCompiledResources() throws Throwable {
     if (compiledResources == null) {
-      AndroidApiLevel minApi = ToolHelper.getMinApiLevelForDexVm();
       AndroidAppConsumers sink = new AndroidAppConsumers();
       R8.run(
           R8Command.builder()
               .setMode(CompilationMode.DEBUG)
               .addProgramFiles(DebugTestBase.DEBUGGEE_JAR)
               .setProgramConsumer(sink.wrapClassFileConsumer(null))
-              .addLibraryFiles(ToolHelper.getAndroidJar(minApi))
+              .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
               .build());
       compiledResources = sink.build();
     }
diff --git a/src/test/java/com/android/tools/r8/debuginfo/DebugInfoInspector.java b/src/test/java/com/android/tools/r8/debuginfo/DebugInfoInspector.java
index aa8bc0c..3ccf46d 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/DebugInfoInspector.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/DebugInfoInspector.java
@@ -20,7 +20,7 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.HashSet;
@@ -49,13 +49,13 @@
     }
   }
 
-  public DebugInfoInspector(DexInspector inspector, String clazz, MethodSignature method) {
+  public DebugInfoInspector(CodeInspector inspector, String clazz, MethodSignature method) {
     this(inspector.clazz(clazz).method(method).getMethod(), inspector.getFactory());
   }
 
   public DebugInfoInspector(AndroidApp app, String clazz, MethodSignature method)
       throws IOException, ExecutionException {
-    this(new DexInspector(app), clazz, method);
+    this(new CodeInspector(app), clazz, method);
   }
 
   public boolean hasLocalsInfo() {
diff --git a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
index c67cf32..0f8ac65 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
@@ -40,33 +40,49 @@
 @RunWith(Parameterized.class)
 public class InliningWithoutPositionsTestRunner {
 
+  enum Backend {
+    CF,
+    DEX
+  }
+
   private static final String TEST_CLASS = "InliningWithoutPositionsTestSource";
   private static final String TEST_PACKAGE = "com.android.tools.r8.debuginfo";
 
   @ClassRule public static TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
 
+  private final Backend backend;
   private final boolean mainPos;
   private final boolean foo1Pos;
   private final boolean barPos;
   private final boolean foo2Pos;
   private final Location throwLocation;
 
-  @Parameters(name = "main/foo1/bar/foo2 positions: {0}/{1}/{2}/{3}, throwLocation: {4}")
+  @Parameters(name = "{0}: main/foo1/bar/foo2 positions: {1}/{2}/{3}/{4}, throwLocation: {5}")
   public static Collection<Object[]> data() {
     List<Object[]> testCases = new ArrayList<>();
+    for (Backend backend : Backend.values()) {
     for (int i = 0; i < 16; ++i) {
       for (Location throwLocation : Location.values()) {
         if (throwLocation != Location.MAIN) {
-          testCases.add(
-              new Object[] {(i & 1) != 0, (i & 2) != 0, (i & 4) != 0, (i & 8) != 0, throwLocation});
+            testCases.add(
+                new Object[] {
+                  backend, (i & 1) != 0, (i & 2) != 0, (i & 4) != 0, (i & 8) != 0, throwLocation
+                });
         }
       }
+      }
     }
     return testCases;
   }
 
   public InliningWithoutPositionsTestRunner(
-      boolean mainPos, boolean foo1Pos, boolean barPos, boolean foo2Pos, Location throwLocation) {
+      Backend backend,
+      boolean mainPos,
+      boolean foo1Pos,
+      boolean barPos,
+      boolean foo2Pos,
+      Location throwLocation) {
+    this.backend = backend;
     this.mainPos = mainPos;
     this.foo1Pos = foo1Pos;
     this.barPos = barPos;
@@ -79,33 +95,45 @@
     // See InliningWithoutPositionsTestSourceDump for the code compiled here.
     Path testClassDir = temp.newFolder(TEST_PACKAGE.split(".")).toPath();
     Path testClassPath = testClassDir.resolve(TEST_CLASS + ".class");
-    Path outputDexPath = temp.newFolder().toPath();
+    Path outputPath = temp.newFolder().toPath();
 
     Files.write(
         testClassPath,
         InliningWithoutPositionsTestSourceDump.dump(
             mainPos, foo1Pos, barPos, foo2Pos, throwLocation));
 
-    AndroidApiLevel minSdk = ToolHelper.getMinApiLevelForDexVm();
     Path proguardMapPath = testClassDir.resolve("proguard.map");
 
-    ToolHelper.runR8(
+    R8Command.Builder builder =
         R8Command.builder()
             .addProgramFiles(testClassPath)
-            .setMinApiLevel(minSdk.getLevel())
-            .addLibraryFiles(ToolHelper.getAndroidJar(minSdk))
-            .setOutput(outputDexPath, OutputMode.DexIndexed)
             .setMode(CompilationMode.RELEASE)
-            .setProguardMapOutputPath(proguardMapPath)
-            .build(),
-        options -> options.inliningInstructionLimit = 20);
+            .setProguardMapOutputPath(proguardMapPath);
+    if (backend == Backend.DEX) {
+      AndroidApiLevel minSdk = ToolHelper.getMinApiLevelForDexVm();
+      builder
+          .setMinApiLevel(minSdk.getLevel())
+          .addLibraryFiles(ToolHelper.getAndroidJar(minSdk))
+          .setOutput(outputPath, OutputMode.DexIndexed);
+    } else {
+      assert (backend == Backend.CF);
+      builder
+          .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
+          .setOutput(outputPath, OutputMode.ClassFile);
+    }
 
-    ArtCommandBuilder artCommandBuilder = new ArtCommandBuilder();
-    artCommandBuilder.appendClasspath(outputDexPath.resolve("classes.dex").toString());
-    artCommandBuilder.setMainClass(TEST_PACKAGE + "." + TEST_CLASS);
+    ToolHelper.runR8(builder.build(), options -> options.inliningInstructionLimit = 40);
 
-    ProcessResult result = ToolHelper.runArtRaw(artCommandBuilder);
+    ProcessResult result;
+    if (backend == Backend.DEX) {
+      ArtCommandBuilder artCommandBuilder = new ArtCommandBuilder();
+      artCommandBuilder.appendClasspath(outputPath.resolve("classes.dex").toString());
+      artCommandBuilder.setMainClass(TEST_PACKAGE + "." + TEST_CLASS);
 
+      result = ToolHelper.runArtRaw(artCommandBuilder);
+    } else {
+      result = ToolHelper.runJava(outputPath, TEST_PACKAGE + "." + TEST_CLASS);
+    }
     assertNotEquals(result.exitCode, 0);
 
     // Verify stack trace.
diff --git a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestSourceDump.java b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestSourceDump.java
index 53d6df3..c72a9c5 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestSourceDump.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestSourceDump.java
@@ -61,8 +61,7 @@
       }
   */
   public static byte[] dump(
-      boolean mainPos, boolean foo1Pos, boolean barPos, boolean foo2Pos, Location throwLocation)
-      throws Exception {
+      boolean mainPos, boolean foo1Pos, boolean barPos, boolean foo2Pos, Location throwLocation) {
     ClassWriter cw = new ClassWriter(0);
     FieldVisitor fv;
     MethodVisitor mv;
diff --git a/src/test/java/com/android/tools/r8/debuginfo/KotlinDebugInfoTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/KotlinDebugInfoTestRunner.java
index 103c07f..80279d5 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/KotlinDebugInfoTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/KotlinDebugInfoTestRunner.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import org.junit.Test;
 
 public class KotlinDebugInfoTestRunner extends TestBase {
@@ -74,7 +73,7 @@
             .setProgramConsumer(consumer)
             .addProgramFiles(inputJar);
     if ((consumer instanceof ClassFileConsumer)) {
-      builder.addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME));
+      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
     } else {
       builder.addLibraryFiles(ToolHelper.getAndroidJar(ToolHelper.getMinApiLevelForDexVm()));
     }
diff --git a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
index f37b5ed..3b1e30a 100644
--- a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
+++ b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
@@ -26,7 +26,7 @@
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.Files;
 import java.nio.file.Path;
@@ -127,7 +127,7 @@
     AndroidApp application = AndroidApp.builder()
         .addDexProgramData(Files.toByteArray(originalDexFile.toFile()), Origin.unknown())
         .build();
-    DexInspector inspector = new DexInspector(application);
+    CodeInspector inspector = new CodeInspector(application);
     DexEncodedMethod method = getMethod(
         inspector,
         "android.databinding.DataBinderMapperImpl",
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
index 7c4c250..f1c8742 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
@@ -21,8 +21,8 @@
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dexsplitter.DexSplitter.Options;
 import com.android.tools.r8.utils.FeatureClassMapping.FeatureMappingException;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import java.io.FileNotFoundException;
@@ -363,7 +363,7 @@
 
     // Ensure that the Class1 is actually in the correct split. Note that Class2 would have been
     // shaken away.
-    DexInspector inspector = new DexInspector(base, proguardMap.toString());
+    CodeInspector inspector = new CodeInspector(base, proguardMap.toString());
     ClassSubject subject = inspector.clazz("dexsplitsample.Class1");
     assertTrue(subject.isPresent());
     assertTrue(subject.isRenamed());
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 8cba9a0..39b5ff8 100644
--- a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
@@ -23,7 +23,7 @@
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.Collections;
@@ -77,7 +77,7 @@
 
     AndroidApp application = buildApplication(builder);
     AppInfo appInfo = getAppInfo(application);
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod method = getMethod(inspector, DEFAULT_CLASS_NAME, "int", "x",
         ImmutableList.of());
     assertNull(appInfo.lookupVirtualTarget(method.method.holder, method.method));
@@ -147,7 +147,7 @@
 
     AndroidApp application = buildApplication(builder);
     AppInfo appInfo = getAppInfo(application);
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
 
     DexMethod methodXOnTestSuper =
         getMethod(inspector, "TestSuper", "int", "x", ImmutableList.of()).method;
diff --git a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
index 3987e0a..2ec38b4 100644
--- a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
+++ b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
@@ -30,10 +30,10 @@
 import com.android.tools.r8.utils.ArtErrorParser.ArtErrorParserException;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
-import com.android.tools.r8.utils.dexinspector.FoundFieldSubject;
-import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.FoundFieldSubject;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
 import com.google.common.io.ByteStreams;
 import com.google.common.io.Closer;
 import java.io.File;
@@ -132,8 +132,8 @@
       if (referenceApk == null) {
         throw e;
       }
-      DexInspector theirs = new DexInspector(Paths.get(referenceApk));
-      DexInspector ours = new DexInspector(out);
+      CodeInspector theirs = new CodeInspector(Paths.get(referenceApk));
+      CodeInspector ours = new CodeInspector(out);
       List<ArtErrorInfo> errors;
       try {
         errors = ArtErrorParser.parse(e.getMessage());
@@ -194,8 +194,8 @@
   public void assertIdenticalApplicationsUpToCode(
       AndroidApp app1, AndroidApp app2, boolean allowNewClassesInApp2)
       throws IOException, ExecutionException {
-    DexInspector inspect1 = new DexInspector(app1);
-    DexInspector inspect2 = new DexInspector(app2);
+    CodeInspector inspect1 = new CodeInspector(app1);
+    CodeInspector inspect2 = new CodeInspector(app2);
 
     class Pair<T> {
       private T first;
@@ -213,7 +213,7 @@
     // Collect all classes from both inspectors, indexed by finalDescriptor.
     Map<String, Pair<FoundClassSubject>> allClasses = new HashMap<>();
 
-    BiConsumer<DexInspector, Boolean> collectClasses =
+    BiConsumer<CodeInspector, Boolean> collectClasses =
         (inspector, selectFirst) -> {
           inspector.forAllClasses(
               clazz -> {
diff --git a/src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java b/src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java
index c011f6f..68daeb8 100644
--- a/src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java
+++ b/src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.invalid;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
@@ -13,8 +13,8 @@
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.jasmin.JasminTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.ByteArrayOutputStream;
 import java.io.PrintStream;
@@ -54,7 +54,7 @@
             "Ignoring an implementation of the method `void C.method()` because "
                 + "it has multiple definitions"));
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz("C");
     assertThat(clazz, isPresent());
 
@@ -89,7 +89,7 @@
     assertThat(output, containsString("Field `C C.fld` has multiple definitions"));
     assertThat(output, containsString("Field `C C.staticFld` has multiple definitions"));
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz("C");
     assertThat(clazz, isPresent());
 
diff --git a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
index f02098a..b66e6e0 100644
--- a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
@@ -22,7 +22,7 @@
 import com.android.tools.r8.utils.AndroidAppConsumers;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
 import java.util.List;
 import java.util.ListIterator;
@@ -61,7 +61,7 @@
       String returnType,
       String methodName,
       List<String> parameters) {
-    DexInspector inspector = new DexInspector(application);
+    CodeInspector inspector = new CodeInspector(application);
     return getMethod(inspector, className, returnType, methodName, parameters);
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/PhiDefinitionsTestRunner.java b/src/test/java/com/android/tools/r8/ir/PhiDefinitionsTestRunner.java
index 4f2bdeb..ba43a10 100644
--- a/src/test/java/com/android/tools/r8/ir/PhiDefinitionsTestRunner.java
+++ b/src/test/java/com/android/tools/r8/ir/PhiDefinitionsTestRunner.java
@@ -17,7 +17,6 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import java.io.IOException;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import org.junit.Test;
 
 public class PhiDefinitionsTestRunner extends TestBase {
@@ -111,7 +110,7 @@
             .setProgramConsumer(consumer)
             .addProgramFiles(inputJar);
     if (consumer instanceof ClassFileConsumer) {
-      builder.addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME));
+      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
     } else {
       builder.addLibraryFiles(ToolHelper.getAndroidJar(ToolHelper.getMinApiLevelForDexVm()));
     }
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java
index de97052..59bd91b 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java
@@ -36,7 +36,7 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import java.util.function.BiConsumer;
@@ -56,8 +56,8 @@
         new ApplicationReader(app, TEST_OPTIONS, new Timing("NullabilityTest.appReader"))
             .read().toDirect();
     AppInfo appInfo = new AppInfo(dexApplication);
-    DexInspector dexInspector = new DexInspector(appInfo.app);
-    DexEncodedMethod foo = dexInspector.clazz(mainClass.getName()).method(signature).getMethod();
+    CodeInspector codeInspector = new CodeInspector(appInfo.app);
+    DexEncodedMethod foo = codeInspector.clazz(mainClass.getName()).method(signature).getMethod();
     IRCode irCode = foo.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
     NonNullTracker nonNullTracker = new NonNullTracker();
     nonNullTracker.addNonNull(irCode);
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
index 286fb56..d3efebe 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
@@ -33,7 +33,7 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Smali;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.nio.charset.StandardCharsets;
@@ -116,7 +116,7 @@
 
   // Simple one path with a lot of arithmetic operations.
   private static void arithmetic(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod subtract =
         inspector.clazz("Test")
             .method(
@@ -131,7 +131,7 @@
 
   // A couple branches, along with some recursive calls.
   private static void fibonacci(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod fib =
         inspector.clazz("Test")
             .method(new MethodSignature("fibonacci", "int", ImmutableList.of("int")))
@@ -145,7 +145,7 @@
 
   // fill-array-data
   private static void fillArrayData(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod test1 =
         inspector.clazz("Test")
             .method(new MethodSignature("test1", "int[]", ImmutableList.of()))
@@ -176,7 +176,7 @@
 
   // filled-new-array
   private static void filledNewArray(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod test4 =
         inspector.clazz("Test")
             .method(new MethodSignature("test4", "int[]", ImmutableList.of()))
@@ -207,7 +207,7 @@
 
   // Make sure the analysis does not hang.
   private static void infiniteLoop(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod loop2 =
         inspector.clazz("Test")
             .method(new MethodSignature("loop2", "void", ImmutableList.of()))
@@ -226,7 +226,7 @@
 
   // move-exception
   private static void tryCatch(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod test2 =
         inspector.clazz("Test")
             .method(new MethodSignature("test2_throw", "int", ImmutableList.of()))
@@ -244,7 +244,7 @@
 
   // One very complicated example.
   private static void typeConfusion(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod method =
         inspector.clazz("TestObject")
             .method(
@@ -264,7 +264,7 @@
 
   // One more complicated example.
   private static void typeConfusion5(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod method =
         inspector.clazz("TestObject")
             .method(
diff --git a/src/test/java/com/android/tools/r8/ir/desugar/annotations/CovariantReturnTypeAnnotationTransformerTest.java b/src/test/java/com/android/tools/r8/ir/desugar/annotations/CovariantReturnTypeAnnotationTransformerTest.java
index 6aecc60..f1f2842 100644
--- a/src/test/java/com/android/tools/r8/ir/desugar/annotations/CovariantReturnTypeAnnotationTransformerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/desugar/annotations/CovariantReturnTypeAnnotationTransformerTest.java
@@ -4,16 +4,16 @@
 
 package com.android.tools.r8.ir.desugar.annotations;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.AsmTestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.util.Collections;
 import org.junit.Assert;
 import org.junit.Test;
@@ -155,7 +155,7 @@
   }
 
   private void checkPresenceOfSyntheticMethods(AndroidApp output) throws Exception {
-    DexInspector inspector = new DexInspector(output);
+    CodeInspector inspector = new CodeInspector(output);
 
     // Get classes A, B, and C.
     ClassSubject clazzA = inspector.clazz(A.class.getCanonicalName());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/B87341268.java b/src/test/java/com/android/tools/r8/ir/optimize/B87341268.java
index 11c7c0f..ac3952d 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/B87341268.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/B87341268.java
@@ -3,20 +3,20 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.optimize;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import org.junit.Test;
 
 public class B87341268 extends TestBase {
   @Test
   public void test() throws Exception {
     AndroidApp app = compileWithD8(readClasses(TestClass.class));
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(TestClass.class);
     assertThat(clazz, isPresent());
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java
index 5a2bc22..0eac6bb 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java
@@ -19,8 +19,8 @@
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -43,7 +43,7 @@
   @Test
   public void testWriteOnlyField_putObject_gone() throws Exception {
     Path processedApp = runR8(EXAMPLE_KEEP);
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject clazz = inspector.clazz(WRITE_ONLY_FIELD + ".WriteOnlyCls");
     clazz.forAllMethods(
         methodSubject -> {
@@ -71,7 +71,7 @@
   @Test
   public void testWriteOnlyField_dontoptimize() throws Exception {
     Path processedApp = runR8(DONT_OPTIMIZE);
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject clazz = inspector.clazz(WRITE_ONLY_FIELD + ".WriteOnlyCls");
     clazz.forAllMethods(
         methodSubject -> {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java
index 2ef43fd..9993b68 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java
@@ -28,7 +28,7 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.util.function.Consumer;
 import org.junit.Test;
 
@@ -46,8 +46,8 @@
         new ApplicationReader(app, TEST_OPTIONS, new Timing("NonNullMarkerTest.appReader"))
             .read().toDirect();
     AppInfo appInfo = new AppInfo(dexApplication);
-    DexInspector dexInspector = new DexInspector(appInfo.app);
-    DexEncodedMethod foo = dexInspector.clazz(testClass.getName()).method(signature).getMethod();
+    CodeInspector codeInspector = new CodeInspector(appInfo.app);
+    DexEncodedMethod foo = codeInspector.clazz(testClass.getName()).method(signature).getMethod();
     IRCode irCode = foo.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
     checkCountOfNonNull(irCode, 0);
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
index 7284384..dd7756b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
@@ -30,9 +30,9 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -145,14 +145,14 @@
 
   private void dump(Path path, String title) throws Throwable {
     System.out.println(title + ":");
-    DexInspector inspector = new DexInspector(path.toAbsolutePath());
+    CodeInspector inspector = new CodeInspector(path.toAbsolutePath());
     inspector.clazz("inlining.Inlining").forAllMethods(m -> dump(m.getMethod()));
     System.out.println(title + " size: " + Files.size(path));
   }
 
   @Test
   public void checkNoInvokes() throws Throwable {
-    DexInspector inspector = new DexInspector(getGeneratedDexFile().toAbsolutePath(),
+    CodeInspector inspector = new CodeInspector(getGeneratedDexFile().toAbsolutePath(),
         getGeneratedProguardMap());
     ClassSubject clazz = inspector.clazz("inlining.Inlining");
 
@@ -189,8 +189,8 @@
 
   @Test
   public void invokeOnNullableReceiver() throws Exception {
-    DexInspector inspector =
-        new DexInspector(getGeneratedDexFile().toAbsolutePath(), getGeneratedProguardMap());
+    CodeInspector inspector =
+        new CodeInspector(getGeneratedDexFile().toAbsolutePath(), getGeneratedProguardMap());
     ClassSubject clazz = inspector.clazz("inlining.Nullability");
     MethodSubject m = clazz.method("int", "inlinable", ImmutableList.of("inlining.A"));
     DexCode code;
@@ -257,8 +257,8 @@
 
   @Test
   public void invokeOnNonNullReceiver() throws Exception {
-    DexInspector inspector =
-        new DexInspector(getGeneratedDexFile().toAbsolutePath(), getGeneratedProguardMap());
+    CodeInspector inspector =
+        new CodeInspector(getGeneratedDexFile().toAbsolutePath(), getGeneratedProguardMap());
     ClassSubject clazz = inspector.clazz("inlining.Nullability");
     MethodSubject m = clazz.method("int", "conditionalOperator", ImmutableList.of("inlining.A"));
     assertTrue(m.isPresent());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java b/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java
index 43b728e..ad0ae87 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java
@@ -17,7 +17,7 @@
 import com.android.tools.r8.ir.optimize.nonnull.NonNullAfterInvoke;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import java.util.List;
@@ -32,10 +32,10 @@
     AndroidApp app = buildAndroidApp(ToolHelper.getClassAsBytes(testClass));
     AndroidApp r8Result = compileWithR8(app,
         "-keep class " + testClass.getCanonicalName() + " { *; }");
-    DexInspector dexInspector = new DexInspector(r8Result);
+    CodeInspector codeInspector = new CodeInspector(r8Result);
     for (MethodSignature signature : signatures) {
       DexEncodedMethod method =
-          dexInspector.clazz(testClass.getName()).method(signature).getMethod();
+          codeInspector.clazz(testClass.getName()).method(signature).getMethod();
       long count = Arrays.stream(method.getCode().asDexCode().instructions)
           .filter(SimplifyIfNotNullTest::isIf).count();
       assertEquals(0, count);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
index d40e202..793da3c 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
@@ -46,8 +46,8 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.Sets;
 import java.nio.file.Path;
 import java.util.Collections;
@@ -81,7 +81,7 @@
     String artOutput = runOnArt(app, TrivialTestClass.class);
     assertEquals(javaOutput, artOutput);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(TrivialTestClass.class);
 
     assertEquals(
@@ -153,7 +153,7 @@
     String artOutput = runOnArt(app, BuildersTestClass.class);
     assertEquals(javaOutput, artOutput);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(BuildersTestClass.class);
 
     assertEquals(
@@ -238,7 +238,7 @@
     String artOutput = runOnArt(app, CodeTestClass.class);
     assertEquals(javaOutput, artOutput);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(C.class);
 
     assertEquals(
@@ -274,7 +274,7 @@
     String artOutput = runOnArt(app, InvalidRootsTestClass.class);
     assertEquals(javaOutput, artOutput);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(InvalidRootsTestClass.class);
 
     assertEquals(
@@ -315,7 +315,7 @@
     String artOutput = runOnArt(app, LambdasTestClass.class);
     assertEquals(javaOutput, artOutput);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(LambdasTestClass.class);
 
     assertEquals(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeInterfaceToInvokeVirtualTest.java b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeInterfaceToInvokeVirtualTest.java
index 0ae7971..c5d6261 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeInterfaceToInvokeVirtualTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeInterfaceToInvokeVirtualTest.java
@@ -24,8 +24,8 @@
 import com.android.tools.r8.ir.optimize.devirtualize.invokeinterface.Main;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
@@ -67,9 +67,9 @@
     Path out = temp.getRoot().toPath();
     AndroidApp processedApp = runR8(originalApp, Main.class, out);
 
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject clazz = dexInspector.clazz(main);
-    DexEncodedMethod m = clazz.method(DexInspector.MAIN).getMethod();
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject clazz = codeInspector.clazz(main);
+    DexEncodedMethod m = clazz.method(CodeInspector.MAIN).getMethod();
     DexCode code = m.getCode().asDexCode();
     long numOfInvokeInterface = filterInstructionKind(code, InvokeInterface.class).count();
     // List#add, List#get
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
index 4b603952..5cdaac8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
@@ -22,9 +22,9 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.nio.file.Path;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -57,7 +57,7 @@
     String artOutput = runOnArt(app, InterfaceTargetsTestClass.class);
     assertEquals(javaOutput, artOutput);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(InterfaceTargetsTestClass.class);
 
     assertFalse(getMethodSubject(clazz,
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java b/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
index c79e50e..2c66eb1 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.regalloc;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertThat;
@@ -11,8 +11,8 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.util.List;
 import java.util.Map;
 import org.junit.Test;
@@ -21,7 +21,7 @@
   @Test
   public void test1() throws Exception {
     AndroidApp app = compileWithD8(readClasses(TestClass.class));
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(TestClass.class);
     assertThat(clazz, isPresent());
   }
@@ -29,7 +29,7 @@
   @Test
   public void test2() throws Exception {
     AndroidApp app = compileWithD8(readClasses(OtherTestClass.class));
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(OtherTestClass.class);
     assertThat(clazz, isPresent());
     ToolHelper.ProcessResult d8Result = runOnArtRaw(app, OtherTestClass.class.getCanonicalName());
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/B79405526.java b/src/test/java/com/android/tools/r8/ir/regalloc/B79405526.java
index 36156eb..4065493 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/B79405526.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/B79405526.java
@@ -4,20 +4,20 @@
 
 package com.android.tools.r8.ir.regalloc;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import org.junit.Test;
 
 public class B79405526 extends TestBase {
   @Test
   public void test() throws Exception {
     AndroidApp app = compileWithD8(readClasses(TestClass.class));
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(TestClass.class);
     assertThat(clazz, isPresent());
     // Throws if a method in TestClass does not verify.
diff --git a/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java b/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java
index d8861b6..6f8d39c 100644
--- a/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java
+++ b/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java
@@ -11,7 +11,7 @@
 import com.android.tools.r8.utils.ArtErrorParser;
 import com.android.tools.r8.utils.ArtErrorParser.ArtErrorInfo;
 import com.android.tools.r8.utils.ArtErrorParser.ArtErrorParserException;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -60,8 +60,8 @@
     } catch (AssertionError e) {
       AndroidApp fromDexApp =
           ToolHelper.runR8(dexFromDX(), options -> options.ignoreMissingClasses = true);
-      DexInspector fromDex = new DexInspector(fromDexApp);
-      DexInspector fromJar = new DexInspector(result);
+      CodeInspector fromDex = new CodeInspector(fromDexApp);
+      CodeInspector fromJar = new CodeInspector(result);
       List<ArtErrorInfo> errors;
       try {
         errors = ArtErrorParser.parse(e.getMessage());
diff --git a/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java b/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
index ed9194e..7e90163 100644
--- a/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
+++ b/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
@@ -7,7 +7,7 @@
 
 import com.android.tools.r8.ir.desugar.InterfaceMethodRewriter;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
@@ -33,9 +33,9 @@
     JasminBuilder builder = buildClass();
     AndroidApp androidApp = compileWithD8(builder);
 
-    DexInspector dexInspector = new DexInspector(androidApp);
+    CodeInspector codeInspector = new CodeInspector(androidApp);
     assertFalse(
-        dexInspector
+        codeInspector
             .clazz("LMyAnnotation" + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX + ";")
             .isAnnotation());
   }
diff --git a/src/test/java/com/android/tools/r8/jasmin/DebugLocalTests.java b/src/test/java/com/android/tools/r8/jasmin/DebugLocalTests.java
index b56824d..a6505c8 100644
--- a/src/test/java/com/android/tools/r8/jasmin/DebugLocalTests.java
+++ b/src/test/java/com/android/tools/r8/jasmin/DebugLocalTests.java
@@ -12,9 +12,9 @@
 import com.android.tools.r8.jasmin.JasminBuilder.ClassFileVersion;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
@@ -101,7 +101,7 @@
     AndroidApp jasminApp = builder.build();
     AndroidApp d8App = ToolHelper.runD8(jasminApp);
 
-    DexInspector inspector = new DexInspector(d8App);
+    CodeInspector inspector = new CodeInspector(d8App);
     ClassSubject classSubject = inspector.clazz("Test");
     MethodSubject methodSubject = classSubject.method(foo);
     DexCode code = methodSubject.getMethod().getCode().asDexCode();
diff --git a/src/test/java/com/android/tools/r8/jasmin/JumboStringTests.java b/src/test/java/com/android/tools/r8/jasmin/JumboStringTests.java
index c7a32b3..40928ee 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JumboStringTests.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JumboStringTests.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
@@ -91,7 +91,7 @@
     AndroidApp d8App = ToolHelper.runD8(jasminApp);
     assertEquals(expected, runOnArt(d8App, clazz.name));
 
-    DexInspector inspector = new DexInspector(d8App);
+    CodeInspector inspector = new CodeInspector(d8App);
     for (Entry<String, MethodSignature> entry : classes.entrySet()) {
       DebugInfoInspector info = new DebugInfoInspector(inspector, entry.getKey(), entry.getValue());
       info.checkStartLine(1);
diff --git a/src/test/java/com/android/tools/r8/jasmin/JumpSubroutineTests.java b/src/test/java/com/android/tools/r8/jasmin/JumpSubroutineTests.java
index ec18fac..fd68772 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JumpSubroutineTests.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JumpSubroutineTests.java
@@ -16,7 +16,6 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import org.junit.Test;
 
 public class JumpSubroutineTests extends JasminTestBase {
@@ -40,7 +39,7 @@
         R8Command.builder()
             .addProgramFiles(inputJar)
             .setOutput(outputJar, OutputMode.ClassFile)
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .build(),
         options -> options.enableCfFrontend = true);
     ProcessResult processResult = ToolHelper.runJava(outputJar, main);
diff --git a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
index c2dd7b1..4919227 100644
--- a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
+++ b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
@@ -14,9 +14,9 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
-import com.android.tools.r8.utils.dexinspector.AnnotationSubject;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.AnnotationSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -132,9 +132,9 @@
 
     compileWithR8(INPUT_PATH, outputPath, SHRINK_NO_KEEP_CONFIG);
 
-    DexInspector dexInspector =
-        new DexInspector(outputPath.resolve("classes.dex"), getGeneratedProguardMap());
-    ClassSubject classSubject = dexInspector.clazz("HelloKt");
+    CodeInspector codeInspector =
+        new CodeInspector(outputPath.resolve("classes.dex"), getGeneratedProguardMap());
+    ClassSubject classSubject = codeInspector.clazz("HelloKt");
     AnnotationSubject annotationSubject =
         classSubject.annotation("dalvik.annotation.SourceDebugExtension");
     Assert.assertFalse(annotationSubject.isPresent());
@@ -147,8 +147,8 @@
         new ReadSourceDebugExtensionAttribute(Opcodes.ASM6, null);
     classReader.accept(sourceDebugExtensionReader, 0);
 
-    DexInspector dexInspector = new DexInspector(androidApp);
-    ClassSubject classSubject = dexInspector.clazz("HelloKt");
+    CodeInspector codeInspector = new CodeInspector(androidApp);
+    ClassSubject classSubject = codeInspector.clazz("HelloKt");
 
     AnnotationSubject annotationSubject =
         classSubject.annotation("dalvik.annotation.SourceDebugExtension");
diff --git a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
index 4fd1d8d..4405565 100644
--- a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
@@ -23,10 +23,10 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -112,7 +112,7 @@
     }));
   }
 
-  protected ClassSubject checkClassIsKept(DexInspector inspector, String className) {
+  protected ClassSubject checkClassIsKept(CodeInspector inspector, String className) {
     checkClassExistsInInput(className);
     ClassSubject classSubject = inspector.clazz(className);
     assertNotNull(classSubject);
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
index a28d0c5..67afdd7 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
@@ -17,8 +17,8 @@
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -55,7 +55,7 @@
         clazz.interfaces.size() == 1;
   }
 
-  private static Predicate<DexType> createLambdaCheck(DexInspector inspector) {
+  private static Predicate<DexType> createLambdaCheck(CodeInspector inspector) {
     Set<DexType> lambdaClasses = inspector.allClasses().stream()
         .filter(clazz -> isLambda(clazz.getDexClass()))
         .map(clazz -> clazz.getDexClass().type)
@@ -67,7 +67,7 @@
   public void testJStyleLambdas() throws Exception {
     final String mainClassName = "class_inliner_lambda_j_style.MainKt";
     runTest("class_inliner_lambda_j_style", mainClassName, false, (app) -> {
-      DexInspector inspector = new DexInspector(app);
+      CodeInspector inspector = new CodeInspector(app);
       assertTrue(
           inspector.clazz("class_inliner_lambda_j_style.MainKt$testStateful$1").isPresent());
       assertTrue(
@@ -77,7 +77,7 @@
     });
 
     runTest("class_inliner_lambda_j_style", mainClassName, true, (app) -> {
-      DexInspector inspector = new DexInspector(app);
+      CodeInspector inspector = new CodeInspector(app);
       Predicate<DexType> lambdaCheck = createLambdaCheck(inspector);
       ClassSubject clazz = inspector.clazz(mainClassName);
 
@@ -112,7 +112,7 @@
   public void testKStyleLambdas() throws Exception {
     final String mainClassName = "class_inliner_lambda_k_style.MainKt";
     runTest("class_inliner_lambda_k_style", mainClassName, false, (app) -> {
-      DexInspector inspector = new DexInspector(app);
+      CodeInspector inspector = new CodeInspector(app);
       assertTrue(inspector.clazz(
           "class_inliner_lambda_k_style.MainKt$testKotlinSequencesStateless$1").isPresent());
       assertTrue(inspector.clazz(
@@ -135,7 +135,7 @@
     });
 
     runTest("class_inliner_lambda_k_style", mainClassName, true, (app) -> {
-      DexInspector inspector = new DexInspector(app);
+      CodeInspector inspector = new CodeInspector(app);
       Predicate<DexType> lambdaCheck = createLambdaCheck(inspector);
       ClassSubject clazz = inspector.clazz(mainClassName);
 
@@ -186,7 +186,7 @@
   public void testDataClass() throws Exception {
     final String mainClassName = "class_inliner_data_class.MainKt";
     runTest("class_inliner_data_class", mainClassName, true, (app) -> {
-      DexInspector inspector = new DexInspector(app);
+      CodeInspector inspector = new CodeInspector(app);
       ClassSubject clazz = inspector.clazz(mainClassName);
       assertTrue(collectAccessedTypes(
           type -> !type.toSourceString().startsWith("java."),
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java
index 658e89a..e43e94c 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java
@@ -14,7 +14,7 @@
 import com.android.tools.r8.ir.optimize.lambda.CaptureSignature;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.Lists;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -139,21 +139,21 @@
   }
 
   static class Verifier {
-    final DexInspector dexInspector;
+    final CodeInspector codeInspector;
     final List<DexClass> lambdas = new ArrayList<>();
     final List<DexClass> groups = new ArrayList<>();
 
     Verifier(AndroidApp app) throws IOException, ExecutionException {
-      this(new DexInspector(app));
+      this(new CodeInspector(app));
     }
 
-    Verifier(DexInspector dexInspector) {
-      this.dexInspector = dexInspector;
+    Verifier(CodeInspector codeInspector) {
+      this.codeInspector = codeInspector;
       initGroupsAndLambdas();
     }
 
     private void initGroupsAndLambdas() {
-      dexInspector.forAllClasses(clazz -> {
+      codeInspector.forAllClasses(clazz -> {
         DexClass dexClass = clazz.getDexClass();
         if (isLambdaOrGroup(dexClass)) {
           if (isLambdaGroupClass(dexClass)) {
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinxMetadataExtensionsServiceTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinxMetadataExtensionsServiceTest.java
index 233bb24..87b9487 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinxMetadataExtensionsServiceTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinxMetadataExtensionsServiceTest.java
@@ -20,7 +20,7 @@
 import com.android.tools.r8.kotlin.KotlinLambdaMergingTest.Verifier;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -60,7 +60,7 @@
         "No MetadataExtensions instances found in the classpath")));
     assertTrue(Files.exists(output));
 
-    DexInspector inspector = new DexInspector(output);
+    CodeInspector inspector = new CodeInspector(output);
     Verifier verifier = new Verifier(inspector);
     String pkg = "lambdas_kstyle_trivial";
     verifier.assertLambdaGroups(
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
index 53b7925..4b1b404 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
@@ -16,9 +16,9 @@
 import com.android.tools.r8.kotlin.TestKotlinClass.Visibility;
 import com.android.tools.r8.naming.MemberNaming;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
 import java.nio.file.Path;
 import java.util.Collections;
 import org.junit.Assert;
@@ -65,8 +65,8 @@
     String mainClass = addMainToClasspath("properties.CompanionPropertiesKt",
         "companionProperties_usePrimitiveProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "primitiveProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, "int", propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -94,8 +94,8 @@
     String mainClass = addMainToClasspath("properties.CompanionPropertiesKt",
         "companionProperties_usePrivateProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "privateProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -124,8 +124,8 @@
     String mainClass = addMainToClasspath("properties.CompanionPropertiesKt",
         "companionProperties_useInternalProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "internalProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -153,8 +153,8 @@
     String mainClass = addMainToClasspath("properties.CompanionPropertiesKt",
         "companionProperties_usePublicProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "publicProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -182,8 +182,8 @@
     String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt",
         "companionLateInitProperties_usePrivateLateInitProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "privateLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -210,8 +210,8 @@
     String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt",
         "companionLateInitProperties_useInternalLateInitProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "internalLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -234,8 +234,8 @@
     String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt",
         "companionLateInitProperties_usePublicLateInitProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "publicLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -258,9 +258,9 @@
     String mainClass = addMainToClasspath("accessors.AccessorKt",
         "accessor_accessPropertyFromCompanionClass");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
-      ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+      ClassSubject companionClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "property";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -288,9 +288,9 @@
     String mainClass = addMainToClasspath("accessors.AccessorKt",
         "accessor_accessPropertyFromOuterClass");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
-      ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+      ClassSubject companionClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "property";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -318,8 +318,8 @@
     String mainClass = addMainToClasspath(testedClass.className + "Kt",
         "noUseOfPropertyAccessorFromInnerClass");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, testedClass.getClassName());
 
       for (String propertyName : testedClass.properties.keySet()) {
         MemberNaming.MethodSignature getterAccessor =
@@ -340,8 +340,8 @@
     String mainClass = addMainToClasspath(testedClass.className + "Kt",
         "usePrivatePropertyAccessorFromInnerClass");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, testedClass.getClassName());
 
       String propertyName = "privateProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING,
@@ -371,8 +371,8 @@
     String mainClass = addMainToClasspath(testedClass.className + "Kt",
         "usePrivateLateInitPropertyAccessorFromInnerClass");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, testedClass.getClassName());
 
       String propertyName = "privateLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING,
@@ -402,8 +402,8 @@
     String mainClass = addMainToClasspath(testedClass.className + "Kt",
         "noUseOfPropertyAccessorFromLambda");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "property";
 
       MemberNaming.MethodSignature getterAccessor =
@@ -423,8 +423,8 @@
     String mainClass = addMainToClasspath(testedClass.className + "Kt",
         "usePropertyAccessorFromLambda");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "property";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
       assertFalse(fieldSubject.getField().accessFlags.isStatic());
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
index 45f74af..58eae89 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
@@ -8,9 +8,9 @@
 import com.android.tools.r8.kotlin.TestKotlinClass.Visibility;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.util.Collections;
 import java.util.function.Consumer;
 import org.junit.Test;
@@ -44,8 +44,8 @@
         new MethodSignature("testDataClassGetters", "void", Collections.emptyList());
     final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
     runTest("dataclass", mainClassName, extraRules, disableClassInliner, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject dataClass = checkClassIsKept(codeInspector, TEST_DATA_CLASS.getClassName());
 
       // Getters should be removed after inlining, which is possible only if access is relaxed.
       final boolean areGetterPresent = !allowAccessModification;
@@ -60,7 +60,7 @@
       checkMethodIsRemoved(dataClass, COPY_METHOD);
       checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
 
-      ClassSubject classSubject = checkClassIsKept(dexInspector, mainClassName);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, mainClassName);
       MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
       DexCode dexCode = getDexCode(testMethod);
       if (allowAccessModification) {
@@ -79,8 +79,8 @@
         new MethodSignature("testAllDataClassComponentFunctions", "void", Collections.emptyList());
     final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
     runTest("dataclass", mainClassName, extraRules, disableClassInliner, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject dataClass = checkClassIsKept(codeInspector, TEST_DATA_CLASS.getClassName());
 
       // ComponentN functions should be removed after inlining, which is possible only if access
       // is relaxed.
@@ -96,7 +96,7 @@
       checkMethodIsRemoved(dataClass, COPY_METHOD);
       checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
 
-      ClassSubject classSubject = checkClassIsKept(dexInspector, mainClassName);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, mainClassName);
       MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
       DexCode dexCode = getDexCode(testMethod);
       if (allowAccessModification) {
@@ -114,8 +114,8 @@
         new MethodSignature("testSomeDataClassComponentFunctions", "void", Collections.emptyList());
     final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
     runTest("dataclass", mainClassName, extraRules, disableClassInliner, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject dataClass = checkClassIsKept(codeInspector, TEST_DATA_CLASS.getClassName());
 
       boolean component2IsPresent = !allowAccessModification;
       checkMethodisKeptOrRemoved(dataClass, COMPONENT2_METHOD, component2IsPresent);
@@ -131,7 +131,7 @@
       checkMethodIsRemoved(dataClass, COPY_METHOD);
       checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
 
-      ClassSubject classSubject = checkClassIsKept(dexInspector, mainClassName);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, mainClassName);
       MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
       DexCode dexCode = getDexCode(testMethod);
       if (allowAccessModification) {
@@ -149,8 +149,8 @@
         new MethodSignature("testDataClassCopy", "void", Collections.emptyList());
     final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
     runTest("dataclass", mainClassName, extraRules, disableClassInliner, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject dataClass = checkClassIsKept(codeInspector, TEST_DATA_CLASS.getClassName());
 
       checkMethodIsRemoved(dataClass, COPY_METHOD);
       checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
@@ -164,8 +164,8 @@
         new MethodSignature("testDataClassCopyWithDefault", "void", Collections.emptyList());
     final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
     runTest("dataclass", mainClassName, extraRules, disableClassInliner, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject dataClass = checkClassIsKept(codeInspector, TEST_DATA_CLASS.getClassName());
 
       checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
     });
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
index c764974..c90df04 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
@@ -5,8 +5,8 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import java.util.Collections;
@@ -27,9 +27,9 @@
             "java.lang.String", Lists.newArrayList("java.lang.String", "java.lang.String")));
 
     runTest("intrinsics", "intrinsics.IntrinsicsKt", extraRules, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
+      CodeInspector codeInspector = new CodeInspector(app);
       ClassSubject intrinsicsClass = checkClassIsKept(
-          dexInspector, KOTLIN_INTRINSICS_CLASS.getClassName());
+          codeInspector, KOTLIN_INTRINSICS_CLASS.getClassName());
 
       checkMethodsPresence(intrinsicsClass,
           ImmutableMap.<MethodSignature, Boolean>builder()
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
index 03c2873..89ff81d 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
@@ -11,9 +11,9 @@
 import com.android.tools.r8.naming.MemberNaming;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
 import java.util.Map.Entry;
 import java.util.function.Consumer;
 import org.junit.Test;
@@ -93,8 +93,8 @@
     String mainClass = addMainToClasspath("properties/MutablePropertyKt",
         "mutableProperty_noUseOfProperties");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           MUTABLE_PROPERTY_CLASS.getClassName());
       for (Entry<String, KotlinProperty> property : MUTABLE_PROPERTY_CLASS.properties.entrySet()) {
         MethodSignature getter = MUTABLE_PROPERTY_CLASS.getGetterForProperty(property.getKey());
@@ -116,8 +116,8 @@
     String mainClass = addMainToClasspath("properties/MutablePropertyKt",
         "mutableProperty_usePrivateProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           MUTABLE_PROPERTY_CLASS.getClassName());
       String propertyName = "privateProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
@@ -138,8 +138,8 @@
     String mainClass = addMainToClasspath("properties/MutablePropertyKt",
         "mutableProperty_useProtectedProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           MUTABLE_PROPERTY_CLASS.getClassName());
       String propertyName = "protectedProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
@@ -161,8 +161,8 @@
     String mainClass = addMainToClasspath("properties/MutablePropertyKt",
         "mutableProperty_useInternalProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           MUTABLE_PROPERTY_CLASS.getClassName());
       String propertyName = "internalProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
@@ -184,8 +184,8 @@
     String mainClass = addMainToClasspath("properties/MutablePropertyKt",
         "mutableProperty_usePublicProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           MUTABLE_PROPERTY_CLASS.getClassName());
       String propertyName = "publicProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
@@ -207,8 +207,8 @@
     String mainClass = addMainToClasspath("properties/MutablePropertyKt",
         "mutableProperty_usePrimitiveProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           MUTABLE_PROPERTY_CLASS.getClassName());
       String propertyName = "primitiveProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, "int", propertyName);
@@ -232,8 +232,8 @@
     String mainClass = addMainToClasspath("properties/LateInitPropertyKt",
         "lateInitProperty_noUseOfProperties");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           LATE_INIT_PROPERTY_CLASS.getClassName());
       for (Entry<String, KotlinProperty> property : LATE_INIT_PROPERTY_CLASS.properties.entrySet()) {
         MethodSignature getter = LATE_INIT_PROPERTY_CLASS.getGetterForProperty(property.getKey());
@@ -256,8 +256,8 @@
     String mainClass = addMainToClasspath(
         "properties/LateInitPropertyKt", "lateInitProperty_usePrivateLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           LATE_INIT_PROPERTY_CLASS.getClassName());
       String propertyName = "privateLateInitProp";
       FieldSubject fieldSubject = classSubject.field(JAVA_LANG_STRING, propertyName);
@@ -279,8 +279,8 @@
     String mainClass = addMainToClasspath("properties/LateInitPropertyKt",
         "lateInitProperty_useProtectedLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           LATE_INIT_PROPERTY_CLASS.getClassName());
       String propertyName = "protectedLateInitProp";
       FieldSubject fieldSubject = classSubject.field(JAVA_LANG_STRING, propertyName);
@@ -300,8 +300,8 @@
     String mainClass = addMainToClasspath(
         "properties/LateInitPropertyKt", "lateInitProperty_useInternalLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           LATE_INIT_PROPERTY_CLASS.getClassName());
       String propertyName = "internalLateInitProp";
       FieldSubject fieldSubject = classSubject.field(JAVA_LANG_STRING, propertyName);
@@ -319,8 +319,8 @@
     String mainClass = addMainToClasspath(
         "properties/LateInitPropertyKt", "lateInitProperty_usePublicLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           LATE_INIT_PROPERTY_CLASS.getClassName());
       String propertyName = "publicLateInitProp";
       FieldSubject fieldSubject = classSubject.field(JAVA_LANG_STRING, propertyName);
@@ -338,8 +338,8 @@
     String mainClass = addMainToClasspath(
         "properties/UserDefinedPropertyKt", "userDefinedProperty_noUseOfProperties");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           USER_DEFINED_PROPERTY_CLASS.getClassName());
       for (String propertyName : USER_DEFINED_PROPERTY_CLASS.properties.keySet()) {
         checkMethodIsRemoved(classSubject,
@@ -355,8 +355,8 @@
     String mainClass = addMainToClasspath(
         "properties/UserDefinedPropertyKt", "userDefinedProperty_useProperties");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           USER_DEFINED_PROPERTY_CLASS.getClassName());
       String propertyName = "durationInSeconds";
       // The 'wrapper' property is not assigned to a backing field, it only relies on the wrapped
@@ -381,10 +381,10 @@
     String mainClass = addMainToClasspath(
         "properties.CompanionPropertiesKt", "companionProperties_usePrimitiveProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector,
           "properties.CompanionProperties");
-      ClassSubject companionClass = checkClassIsKept(dexInspector,
+      ClassSubject companionClass = checkClassIsKept(codeInspector,
           COMPANION_PROPERTY_CLASS.getClassName());
       String propertyName = "primitiveProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, "int", propertyName);
@@ -412,10 +412,10 @@
     String mainClass = addMainToClasspath(
         "properties.CompanionPropertiesKt", "companionProperties_usePrivateProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector,
           "properties.CompanionProperties");
-      ClassSubject companionClass = checkClassIsKept(dexInspector,
+      ClassSubject companionClass = checkClassIsKept(codeInspector,
           COMPANION_PROPERTY_CLASS.getClassName());
       String propertyName = "privateProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
@@ -446,10 +446,10 @@
     String mainClass = addMainToClasspath(
         "properties.CompanionPropertiesKt", "companionProperties_useInternalProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector,
           "properties.CompanionProperties");
-      ClassSubject companionClass = checkClassIsKept(dexInspector,
+      ClassSubject companionClass = checkClassIsKept(codeInspector,
           COMPANION_PROPERTY_CLASS.getClassName());
       String propertyName = "internalProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
@@ -477,10 +477,10 @@
     String mainClass = addMainToClasspath(
         "properties.CompanionPropertiesKt", "companionProperties_usePublicProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector,
           "properties.CompanionProperties");
-      ClassSubject companionClass = checkClassIsKept(dexInspector,
+      ClassSubject companionClass = checkClassIsKept(codeInspector,
           COMPANION_PROPERTY_CLASS.getClassName());
       String propertyName = "publicProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
@@ -509,9 +509,9 @@
     String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt",
         "companionLateInitProperties_usePrivateLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
-      ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+      ClassSubject companionClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "privateLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -540,9 +540,9 @@
     String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt",
         "companionLateInitProperties_useInternalLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
-      ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+      ClassSubject companionClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "internalLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -564,9 +564,9 @@
     String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt",
         "companionLateInitProperties_usePublicLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
-      ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+      ClassSubject companionClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "publicLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -588,8 +588,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_usePrimitiveProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "primitiveProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, "int", propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -615,8 +615,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_usePrivateProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "privateProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -642,8 +642,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_useInternalProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "internalProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -669,8 +669,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_usePublicProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "publicProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -696,8 +696,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_useLateInitPrivateProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "privateLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -723,8 +723,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_useLateInitInternalProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "internalLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -746,8 +746,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_useLateInitPublicProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "publicLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -769,8 +769,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_usePrimitiveProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "primitiveProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, "int", propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -796,8 +796,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_usePrivateProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "privateProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -822,8 +822,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_useInternalProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "internalProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -848,8 +848,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_usePublicProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "publicProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -875,8 +875,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_useLateInitPrivateProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject fileClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject fileClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "privateLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(fileClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -901,8 +901,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_useLateInitInternalProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "internalLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -925,8 +925,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_useLateInitPublicProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "publicLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
diff --git a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
index fd41344..12fdaf9 100644
--- a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
@@ -10,9 +10,9 @@
 import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import org.junit.Test;
@@ -35,8 +35,8 @@
     final String mainClassName = ex1.getClassName();
     final String extraRules = keepAllMembers(mainClassName);
     runTest(FOLDER, mainClassName, extraRules, app -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject clazz = checkClassIsKept(dexInspector, ex1.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject clazz = checkClassIsKept(codeInspector, ex1.getClassName());
 
       MethodSubject testMethod = checkMethodIsKept(clazz, testMethodSignature);
       DexCode dexCode = getDexCode(testMethod);
@@ -61,8 +61,8 @@
     final String mainClassName = ex2.getClassName();
     final String extraRules = keepAllMembers(mainClassName);
     runTest(FOLDER, mainClassName, extraRules, app -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject clazz = checkClassIsKept(dexInspector, ex2.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject clazz = checkClassIsKept(codeInspector, ex2.getClassName());
 
       MethodSubject testMethod = checkMethodIsKept(clazz, testMethodSignature);
       DexCode dexCode = getDexCode(testMethod);
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
index dc5347e..fc41672 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -66,8 +66,8 @@
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import java.io.IOException;
@@ -484,7 +484,7 @@
         .forEach(
             p -> {
               try {
-                DexInspector i = new DexInspector(AndroidApp.builder().addProgramFiles(p).build());
+                CodeInspector i = new CodeInspector(AndroidApp.builder().addProgramFiles(p).build());
                 assertFalse("Found " + clazz + " in file " + p, i.clazz(clazz).isPresent());
               } catch (IOException | ExecutionException e) {
                 e.printStackTrace();
@@ -519,7 +519,7 @@
       throws IOException, ExecutionException, ProguardRuleParserException,
       CompilationFailedException {
     AndroidApp originalApp = AndroidApp.builder().addProgramFiles(app).build();
-    DexInspector originalInspector = new DexInspector(originalApp);
+    CodeInspector originalInspector = new CodeInspector(originalApp);
     for (String clazz : mainDex) {
       assertTrue("Class " + clazz + " does not exist in input",
           originalInspector.clazz(clazz).isPresent());
@@ -583,8 +583,8 @@
       assertTrue("Output run only produced one dex file.",
           1 < Files.list(outDir).filter(FileUtils::isDexFile).count());
     }
-    DexInspector inspector =
-        new DexInspector(
+    CodeInspector inspector =
+        new CodeInspector(
             AndroidApp.builder().addProgramFiles(outDir.resolve("classes.dex")).build());
     for (String clazz : mainDex) {
       if (!inspector.clazz(clazz).isPresent()) {
@@ -771,7 +771,7 @@
     }
 
     @Override
-    public Position getDebugPositionAtOffset(int offset) {
+    public Position getCanonicalDebugPositionAtOffset(int offset) {
       throw new Unreachable();
     }
 
diff --git a/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java b/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java
index fea8160..c1741c9 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java
@@ -23,7 +23,7 @@
 import com.android.tools.r8.VmTestRunner;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -84,7 +84,7 @@
         .setMainDexListConsumer(
             (string, handler) -> mainDexList.content = string)
         .build();
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(command));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(command));
     assertTrue(inspector.clazz("instrumentationtest.InstrumentationTest").isPresent());
     assertTrue(mainDexList.content.contains("junit/framework/TestCase.class"));
     // TODO(72794301): Two copies of this message is a bit over the top.
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java b/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java
index d3805d9..6c6e69d 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.memberrebinding;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -17,9 +17,9 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.List;
@@ -74,10 +74,10 @@
       options.enableInlining = false;
       options.enableClassMerging = false;
     });
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject classSubject = dexInspector.clazz(TestMain.class);
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject classSubject = codeInspector.clazz(TestMain.class);
     assertThat(classSubject, isPresent());
-    MethodSubject methodSubject = classSubject.method(DexInspector.MAIN);
+    MethodSubject methodSubject = classSubject.method(CodeInspector.MAIN);
     assertThat(methodSubject, isPresent());
     DexCode dexCode = methodSubject.getMethod().getCode().asDexCode();
     assertTrue(dexCode.instructions[2] instanceof InvokeVirtual);
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
index c2ec4b7..80379e0 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
@@ -12,11 +12,11 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldAccessInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldAccessInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Path;
@@ -55,8 +55,8 @@
   private final Frontend kind;
   private final Path originalDex;
   private final Path programFile;
-  private final Consumer<DexInspector> inspection;
-  private final Consumer<DexInspector> originalInspection;
+  private final Consumer<CodeInspector> inspection;
+  private final Consumer<CodeInspector> originalInspection;
   private final int minApiLevel;
 
   @Rule
@@ -101,9 +101,9 @@
     return !invoke.holder().is("java.io.PrintStream");
   }
 
-  private static void inspectOriginalMain(DexInspector inspector) {
+  private static void inspectOriginalMain(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding.Memberrebinding")
-        .method(DexInspector.MAIN);
+        .method(CodeInspector.MAIN);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(MemberRebindingTest::coolInvokes);
     assertTrue(iterator.next().holder().is("memberrebinding.ClassAtBottomOfChain"));
@@ -129,9 +129,9 @@
     assertFalse(iterator.hasNext());
   }
 
-  private static void inspectMain(DexInspector inspector) {
+  private static void inspectMain(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding.Memberrebinding")
-        .method(DexInspector.MAIN);
+        .method(CodeInspector.MAIN);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(MemberRebindingTest::coolInvokes);
     assertTrue(iterator.next().holder().is("memberrebinding.ClassAtBottomOfChain"));
@@ -160,9 +160,9 @@
     assertFalse(iterator.hasNext());
   }
 
-  private static void inspectOriginalMain2(DexInspector inspector) {
+  private static void inspectOriginalMain2(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding2.Memberrebinding")
-        .method(DexInspector.MAIN);
+        .method(CodeInspector.MAIN);
     Iterator<FieldAccessInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isFieldAccess);
     // Run through instance put, static put, instance get and instance get.
@@ -176,9 +176,9 @@
     assertFalse(iterator.hasNext());
   }
 
-  private static void inspectMain2(DexInspector inspector) {
+  private static void inspectMain2(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding2.Memberrebinding")
-        .method(DexInspector.MAIN);
+        .method(CodeInspector.MAIN);
     Iterator<FieldAccessInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isFieldAccess);
     // Run through instance put, static put, instance get and instance get.
@@ -195,7 +195,7 @@
   public static MethodSignature TEST =
       new MethodSignature("test", "void", new String[]{});
 
-  private static void inspectOriginal3(DexInspector inspector) {
+  private static void inspectOriginal3(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding3.Memberrebinding").method(TEST);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
@@ -205,7 +205,7 @@
     assertFalse(iterator.hasNext());
   }
 
-  private static void inspect3(DexInspector inspector) {
+  private static void inspect3(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding3.Memberrebinding").method(TEST);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
@@ -215,7 +215,7 @@
     assertFalse(iterator.hasNext());
   }
 
-  private static void inspectOriginal4(DexInspector inspector) {
+  private static void inspectOriginal4(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding4.Memberrebinding").method(TEST);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
@@ -224,7 +224,7 @@
     assertFalse(iterator.hasNext());
   }
 
-  private static void inspect4(DexInspector inspector) {
+  private static void inspect4(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding4.Memberrebinding").method(TEST);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
@@ -243,14 +243,14 @@
     final String name;
     final Frontend kind;
     final AndroidVersion version;
-    final Consumer<DexInspector> originalInspection;
-    final Consumer<DexInspector> processedInspection;
+    final Consumer<CodeInspector> originalInspection;
+    final Consumer<CodeInspector> processedInspection;
 
     private TestConfiguration(String name,
         Frontend kind,
         AndroidVersion version,
-        Consumer<DexInspector> originalInspection,
-        Consumer<DexInspector> processedInspection) {
+        Consumer<CodeInspector> originalInspection,
+        Consumer<CodeInspector> processedInspection) {
       this.name = name;
       this.kind = kind;
       this.version = version;
@@ -261,8 +261,8 @@
     public static void add(ImmutableList.Builder<TestConfiguration> builder,
         String name,
         AndroidVersion version,
-        Consumer<DexInspector> originalInspection,
-        Consumer<DexInspector> processedInspection) {
+        Consumer<CodeInspector> originalInspection,
+        Consumer<CodeInspector> processedInspection) {
       if (version == AndroidVersion.PRE_N) {
         builder.add(new TestConfiguration(name, Frontend.DEX, version, originalInspection,
             processedInspection));
@@ -330,11 +330,11 @@
     Path processed = Paths.get(out, "classes.dex");
 
     if (kind == Frontend.DEX) {
-      DexInspector inspector = new DexInspector(originalDex);
+      CodeInspector inspector = new CodeInspector(originalDex);
       originalInspection.accept(inspector);
     }
 
-    DexInspector inspector = new DexInspector(processed);
+    CodeInspector inspector = new CodeInspector(processed);
     inspection.accept(inspector);
 
     // We don't run Art, as the test R8RunExamplesTest already does that.
diff --git a/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java b/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
index 9b120e6..d7d0538 100644
--- a/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
+++ b/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
@@ -6,6 +6,7 @@
 
 import static org.junit.Assert.assertTrue;
 
+import com.android.tools.r8.ClassFileConsumer;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.R8Command;
@@ -13,22 +14,46 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CfInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject.JumboStringMode;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
+@RunWith(Parameterized.class)
 public class MoveStringConstantsTest extends TestBase {
-  private void runTest(Consumer<DexInspector> inspection) throws Exception {
+
+  private Backend backend;
+
+  @Parameters(name = "Backend: {0}")
+  public static Collection<Backend> data() {
+    return Arrays.asList(Backend.values());
+  }
+
+  private void runTest(Consumer<CodeInspector> inspection) throws Exception {
     R8Command.Builder builder = R8Command.builder();
     builder.addProgramFiles(ToolHelper.getClassFileForTestClass(TestClass.class));
     builder.addProgramFiles(ToolHelper.getClassFileForTestClass(Utils.class));
-    builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
+    builder.addLibraryFiles(
+        backend == Backend.DEX
+            ? ToolHelper.getDefaultAndroidJar()
+            : ToolHelper.getJava8RuntimeJar());
+    assert (backend == Backend.CF || backend == Backend.DEX);
+    builder.setProgramConsumer(
+        backend == Backend.DEX
+            ? DexIndexedConsumer.emptyConsumer()
+            : ClassFileConsumer.emptyConsumer());
     builder.setMode(CompilationMode.RELEASE);
     builder.addProguardConfiguration(
         ImmutableList.of(
@@ -37,14 +62,35 @@
             "-allowaccessmodification"
         ),
         Origin.unknown());
-    AndroidApp app = ToolHelper.runR8(builder.build());
-    inspection.accept(new DexInspector(app));
+    AndroidApp app =
+        ToolHelper.runR8(
+            builder.build(),
+            options -> {
+              // This test relies on that TestClass.java/Utils.check will be inlined.
+              // Its size must fit into the inlining instruction limit. For CF, the default
+              // setting (5) is just too small.
+              options.inliningInstructionLimit = 10;
+            });
+    inspection.accept(
+        new CodeInspector(
+            app,
+            options -> {
+              options.enableCfFrontend = true;
+            }));
 
-    // Run on Art to check generated code against verifier.
-    runOnArt(app, TestClass.class);
+    if (backend == Backend.DEX) {
+      // Run on Art to check generated code against verifier.
+      runOnArt(app, TestClass.class);
+    } else {
+      runOnJava(app, TestClass.class);
+    }
   }
 
-  private void validate(DexInspector inspector) {
+  public MoveStringConstantsTest(Backend backend) {
+    this.backend = backend;
+  }
+
+  private void validate(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(TestClass.class);
     assertTrue(clazz.isPresent());
 
@@ -53,37 +99,41 @@
         clazz.method("void", "foo", ImmutableList.of(
             "java.lang.String", "java.lang.String", "java.lang.String", "java.lang.String"));
     assertTrue(methodThrowToBeInlined.isPresent());
-    validateSequence(methodThrowToBeInlined.iterateInstructions(),
+    assert (backend == Backend.DEX || backend == Backend.CF);
+    Predicate<InstructionSubject> nullCheck =
+        backend == Backend.DEX
+            ? InstructionSubject::isIfEqz
+            : insn -> ((CfInstructionSubject) insn).isIfNull();
+    validateSequence(
+        methodThrowToBeInlined.iterateInstructions(),
         // 'if' with "foo#1" is flipped.
-        InstructionSubject::isIfEqz,
+        nullCheck,
 
         // 'if' with "foo#2" is removed along with the constant.
 
         // 'if' with "foo#3" is removed so now we have unconditional call.
-        insn -> insn.isConstString("StringConstants::foo#3"),
+        insn -> insn.isConstString("StringConstants::foo#3", JumboStringMode.DISALLOW),
         InstructionSubject::isInvokeStatic,
         InstructionSubject::isThrow,
 
         // 'if's with "foo#4" and "foo#5" are flipped, but their throwing branches
         // are not moved to the end of the code (area for improvement?).
-        insn -> insn.isConstString("StringConstants::foo#4"),
-        InstructionSubject::isIfEqz, // Flipped if
+        insn -> insn.isConstString("StringConstants::foo#4", JumboStringMode.DISALLOW),
+        nullCheck, // Flipped if
         InstructionSubject::isGoto, // Jump around throwing branch.
         InstructionSubject::isInvokeStatic, // Throwing branch.
         InstructionSubject::isThrow,
-
-        insn -> insn.isConstString("StringConstants::foo#5"),
-        InstructionSubject::isIfEqz, // Flipped if
+        insn -> insn.isConstString("StringConstants::foo#5", JumboStringMode.DISALLOW),
+        nullCheck, // Flipped if
         InstructionSubject::isReturnVoid, // Final return statement.
         InstructionSubject::isInvokeStatic, // Throwing branch.
         InstructionSubject::isThrow,
 
         // After 'if' with "foo#1" flipped, always throwing branch
         // moved here along with the constant.
-        insn -> insn.isConstString("StringConstants::foo#1"),
+        insn -> insn.isConstString("StringConstants::foo#1", JumboStringMode.DISALLOW),
         InstructionSubject::isInvokeStatic,
-        InstructionSubject::isThrow
-    );
+        InstructionSubject::isThrow);
   }
 
   @SafeVarargs
diff --git a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java b/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
index 39d7f0b..aaecd58 100644
--- a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
@@ -21,11 +21,11 @@
 import com.android.tools.r8.shaking.ProguardRuleParserException;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
-import com.android.tools.r8.utils.dexinspector.NewInstanceInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.NewInstanceInstructionSubject;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -114,8 +114,8 @@
                     pgConfig -> pgConfig.setApplyMappingFile(proguardMap))
                 .build());
 
-    DexInspector inspector = createDexInspector(instrApp);
-    MethodSubject main = inspector.clazz("applymapping044.Main").method(DexInspector.MAIN);
+    CodeInspector inspector = createDexInspector(instrApp);
+    MethodSubject main = inspector.clazz("applymapping044.Main").method(CodeInspector.MAIN);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
     // B#m()
@@ -169,8 +169,8 @@
                 .build());
 
     // Make sure the given proguard map is indeed applied.
-    DexInspector inspector = createDexInspector(outputApp);
-    MethodSubject main = inspector.clazz("applymapping044.Main").method(DexInspector.MAIN);
+    CodeInspector inspector = createDexInspector(outputApp);
+    MethodSubject main = inspector.clazz("applymapping044.Main").method(CodeInspector.MAIN);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
     // B#m() -> y#n()
@@ -211,9 +211,9 @@
     assertEquals("p", original_f.invokedMethod().name.toString());
   }
 
-  private static DexInspector createDexInspector(AndroidApp outputApp)
+  private static CodeInspector createDexInspector(AndroidApp outputApp)
       throws IOException, ExecutionException {
-    return new DexInspector(
+    return new CodeInspector(
         outputApp,
         o -> {
           o.enableCfFrontend = true;
@@ -236,8 +236,8 @@
                 .build());
 
     // Make sure the given proguard map is indeed applied.
-    DexInspector inspector = createDexInspector(outputApp);
-    MethodSubject main = inspector.clazz("naming001.D").method(DexInspector.MAIN);
+    CodeInspector inspector = createDexInspector(outputApp);
+    MethodSubject main = inspector.clazz("naming001.D").method(CodeInspector.MAIN);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
     // mapping-105 simply includes: naming001.D#keep -> peek
@@ -268,8 +268,8 @@
                 .build());
 
     // Make sure the given proguard map is indeed applied.
-    DexInspector inspector = createDexInspector(outputApp);
-    MethodSubject main = inspector.clazz("naming001.D").method(DexInspector.MAIN);
+    CodeInspector inspector = createDexInspector(outputApp);
+    MethodSubject main = inspector.clazz("naming001.D").method(CodeInspector.MAIN);
 
     Iterator<InstructionSubject> iterator = main.iterateInstructions();
     // naming001.E is renamed to a.a, so first instruction must be: new-instance La/a;
@@ -300,7 +300,11 @@
   private R8Command.Builder getCommandForInstrumentation(
       Path out, Path flag, Path mainApp, Path instrApp) throws IOException {
     return R8Command.builder()
-        .addLibraryFiles(ToolHelper.getDefaultAndroidJar(), mainApp)
+        .addLibraryFiles(
+            backend == Backend.DEX
+                ? ToolHelper.getDefaultAndroidJar()
+                : ToolHelper.getJava8RuntimeJar(),
+            mainApp)
         .addProgramFiles(instrApp)
         .setOutput(out, backend == Backend.DEX ? OutputMode.DexIndexed : OutputMode.ClassFile)
         .addProguardConfigurationFiles(flag);
@@ -309,7 +313,10 @@
   private R8Command.Builder getCommandForApps(Path out, Path flag, Path... jars)
       throws IOException {
     return R8Command.builder()
-        .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
+        .addLibraryFiles(
+            backend == Backend.DEX
+                ? ToolHelper.getDefaultAndroidJar()
+                : ToolHelper.getJava8RuntimeJar())
         .addProgramFiles(jars)
         .setOutput(out, backend == Backend.DEX ? OutputMode.DexIndexed : OutputMode.ClassFile)
         .addProguardConfigurationFiles(flag);
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
index 58e17d1..a9ee851 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
@@ -6,28 +6,29 @@
 import static com.android.tools.r8.utils.DescriptorUtils.descriptorToJavaType;
 import static com.android.tools.r8.utils.DescriptorUtils.isValidJavaType;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.ConstStringJumbo;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexValue.DexValueString;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.ListUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.ConstStringInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject.JumboStringMode;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
+import com.google.common.collect.Streams;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -47,15 +48,20 @@
 
   private final String appFileName;
   private final List<String> keepRulesFiles;
-  private final Consumer<DexInspector> inspection;
+  private final Consumer<CodeInspector> inspection;
+  private final Backend backend;
 
   public IdentifierMinifierTest(
+      Backend backend,
       String test,
       List<String> keepRulesFiles,
-      Consumer<DexInspector> inspection) {
-    this.appFileName = ToolHelper.EXAMPLES_BUILD_DIR + test + "/classes.dex";
+      Consumer<CodeInspector> inspection) {
+    assert backend == Backend.DEX || backend == Backend.CF;
+    this.appFileName =
+        ToolHelper.EXAMPLES_BUILD_DIR + test + (backend == Backend.DEX ? "/classes.dex" : ".jar");
     this.keepRulesFiles = keepRulesFiles;
     this.inspection = inspection;
+    this.backend = backend;
   }
 
   private AndroidApp processedApp;
@@ -65,25 +71,34 @@
     Path out = temp.getRoot().toPath();
     R8Command.Builder builder =
         ToolHelper.addProguardConfigurationConsumer(
-            R8Command.builder(),
-            pgConfig -> {
-              pgConfig.setPrintMapping(true);
-              pgConfig.setPrintMappingFile(out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE));
-            })
-            .setOutput(out, OutputMode.DexIndexed)
-            .addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get))
-            .addLibraryFiles(ToolHelper.getDefaultAndroidJar());
+                R8Command.builder(),
+                pgConfig -> {
+                  pgConfig.setPrintMapping(true);
+                  pgConfig.setPrintMappingFile(out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE));
+                })
+            .setOutput(out, backend == Backend.DEX ? OutputMode.DexIndexed : OutputMode.ClassFile)
+            .addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get));
+    if (backend == Backend.DEX) {
+      builder.addLibraryFiles(ToolHelper.getDefaultAndroidJar());
+    } else if (backend == Backend.CF) {
+      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
+    }
     ToolHelper.getAppBuilder(builder).addProgramFiles(Paths.get(appFileName));
     processedApp = ToolHelper.runR8(builder.build(), o -> o.debug = false);
   }
 
   @Test
   public void identiferMinifierTest() throws Exception {
-    DexInspector dexInspector = new DexInspector(processedApp);
-    inspection.accept(dexInspector);
+    CodeInspector codeInspector =
+        new CodeInspector(
+            processedApp,
+            options -> {
+              options.enableCfFrontend = true;
+            });
+    inspection.accept(codeInspector);
   }
 
-  @Parameters(name = "test: {0} keep: {1}")
+  @Parameters(name = "[{0}] test: {1} keep: {2}")
   public static Collection<Object[]> data() {
     List<String> tests = Arrays.asList(
         "adaptclassstrings",
@@ -92,7 +107,7 @@
         "getmembers",
         "identifiernamestring");
 
-    Map<String, Consumer<DexInspector>> inspections = new HashMap<>();
+    Map<String, Consumer<CodeInspector>> inspections = new HashMap<>();
     inspections.put("adaptclassstrings:keep-rules-1.txt", IdentifierMinifierTest::test1_rule1);
     inspections.put("adaptclassstrings:keep-rules-2.txt", IdentifierMinifierTest::test1_rule2);
     inspections.put(
@@ -103,25 +118,38 @@
     inspections.put("identifiernamestring:keep-rules-2.txt", IdentifierMinifierTest::test2_rule2);
     inspections.put("identifiernamestring:keep-rules-3.txt", IdentifierMinifierTest::test2_rule3);
 
-    return NamingTestBase.createTests(tests, inspections);
+    Collection<Object[]> parameters = NamingTestBase.createTests(tests, inspections);
+
+    // Duplicate parameters for each backend.
+    List<Object[]> parametersWithBackend = new ArrayList<>();
+    for (Backend backend : Backend.values()) {
+      for (Object[] row : parameters) {
+        Object[] newRow = new Object[row.length + 1];
+        newRow[0] = backend;
+        System.arraycopy(row, 0, newRow, 1, row.length);
+        parametersWithBackend.add(newRow);
+      }
+    }
+
+    return parametersWithBackend;
   }
 
   // Without -adaptclassstrings
-  private static void test1_rule1(DexInspector inspector) {
+  private static void test1_rule1(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("adaptclassstrings.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    Code mainCode = main.getMethod().getCode();
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
-    int renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
+    int renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundMain);
     assertEquals(0, renamedYetFoundIdentifierCount);
 
     ClassSubject aClass = inspector.clazz("adaptclassstrings.A");
     MethodSubject bar = aClass.method("void", "bar", ImmutableList.of());
-    Code barCode = bar.getMethod().getCode();
-    verifyPresenceOfConstString(barCode.asDexCode().instructions);
-    renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, barCode.asDexCode().instructions);
+    assertTrue(bar instanceof FoundMethodSubject);
+    FoundMethodSubject foundBar = (FoundMethodSubject) bar;
+    verifyPresenceOfConstString(foundBar);
+    renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundBar);
     assertEquals(0, renamedYetFoundIdentifierCount);
 
     renamedYetFoundIdentifierCount =
@@ -130,21 +158,21 @@
   }
 
   // With -adaptclassstrings *.*A
-  private static void test1_rule2(DexInspector inspector) {
+  private static void test1_rule2(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("adaptclassstrings.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    Code mainCode = main.getMethod().getCode();
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
-    int renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
+    int renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundMain);
     assertEquals(0, renamedYetFoundIdentifierCount);
 
     ClassSubject aClass = inspector.clazz("adaptclassstrings.A");
     MethodSubject bar = aClass.method("void", "bar", ImmutableList.of());
-    Code barCode = bar.getMethod().getCode();
-    verifyPresenceOfConstString(barCode.asDexCode().instructions);
-    renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, barCode.asDexCode().instructions);
+    assertTrue(bar instanceof FoundMethodSubject);
+    FoundMethodSubject foundBar = (FoundMethodSubject) bar;
+    verifyPresenceOfConstString(foundBar);
+    renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundBar);
     assertEquals(1, renamedYetFoundIdentifierCount);
 
     renamedYetFoundIdentifierCount =
@@ -152,64 +180,66 @@
     assertEquals(1, renamedYetFoundIdentifierCount);
   }
 
-  private static void test_atomicfieldupdater(DexInspector inspector) {
+  private static void test_atomicfieldupdater(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("atomicfieldupdater.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    Code mainCode = main.getMethod().getCode();
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
 
     ClassSubject a = inspector.clazz("atomicfieldupdater.A");
-    Set<Instruction> constStringInstructions =
-        getRenamedMemberIdentifierConstStrings(a, mainCode.asDexCode().instructions);
+    Set<InstructionSubject> constStringInstructions =
+        getRenamedMemberIdentifierConstStrings(a, foundMain);
     assertEquals(3, constStringInstructions.size());
   }
 
-  private static void test_forname(DexInspector inspector) {
+  private static void test_forname(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("forname.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    Code mainCode = main.getMethod().getCode();
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
-    int renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
+    int renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundMain);
     assertEquals(1, renamedYetFoundIdentifierCount);
   }
 
-  private static void test_getmembers(DexInspector inspector) {
+  private static void test_getmembers(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("getmembers.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    Code mainCode = main.getMethod().getCode();
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
 
     ClassSubject a = inspector.clazz("getmembers.A");
-    Set<Instruction> constStringInstructions =
-        getRenamedMemberIdentifierConstStrings(a, mainCode.asDexCode().instructions);
+    Set<InstructionSubject> constStringInstructions =
+        getRenamedMemberIdentifierConstStrings(a, foundMain);
     assertEquals(2, constStringInstructions.size());
 
     ClassSubject b = inspector.clazz("getmembers.B");
     MethodSubject inliner = b.method("java.lang.String", "inliner", ImmutableList.of());
-    Code inlinerCode = inliner.getMethod().getCode();
-    constStringInstructions =
-        getRenamedMemberIdentifierConstStrings(a, inlinerCode.asDexCode().instructions);
+    assertTrue(inliner instanceof FoundMethodSubject);
+    FoundMethodSubject foundInliner = (FoundMethodSubject) inliner;
+    constStringInstructions = getRenamedMemberIdentifierConstStrings(a, foundInliner);
     assertEquals(1, constStringInstructions.size());
   }
 
   // Without -identifiernamestring
-  private static void test2_rule1(DexInspector inspector) {
+  private static void test2_rule1(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("identifiernamestring.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    Code mainCode = main.getMethod().getCode();
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
-    int renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
+    int renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundMain);
     assertEquals(0, renamedYetFoundIdentifierCount);
 
     ClassSubject aClass = inspector.clazz("identifiernamestring.A");
     MethodSubject aInit =
         aClass.method("void", "<init>", ImmutableList.of());
-    Code initCode = aInit.getMethod().getCode();
-    verifyPresenceOfConstString(initCode.asDexCode().instructions);
-    renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, initCode.asDexCode().instructions);
+    assertTrue(aInit instanceof FoundMethodSubject);
+    FoundMethodSubject foundAInit = (FoundMethodSubject) aInit;
+    verifyPresenceOfConstString(foundAInit);
+    renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundAInit);
     assertEquals(0, renamedYetFoundIdentifierCount);
 
     renamedYetFoundIdentifierCount =
@@ -218,24 +248,22 @@
   }
 
   // With -identifiernamestring for annotations and name-based filters
-  private static void test2_rule2(DexInspector inspector) {
+  private static void test2_rule2(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("identifiernamestring.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    assertTrue(main.isPresent());
-    Code mainCode = main.getMethod().getCode();
-    assertTrue(mainCode.isDexCode());
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
-    int renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
+    int renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundMain);
     assertEquals(1, renamedYetFoundIdentifierCount);
 
     ClassSubject aClass = inspector.clazz("identifiernamestring.A");
     MethodSubject aInit =
         aClass.method("void", "<init>", ImmutableList.of());
-    Code initCode = aInit.getMethod().getCode();
-    verifyPresenceOfConstString(initCode.asDexCode().instructions);
-    renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, initCode.asDexCode().instructions);
+    assertTrue(aInit instanceof FoundMethodSubject);
+    FoundMethodSubject foundAInit = (FoundMethodSubject) aInit;
+    verifyPresenceOfConstString(foundAInit);
+    renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundAInit);
     assertEquals(1, renamedYetFoundIdentifierCount);
 
     renamedYetFoundIdentifierCount =
@@ -244,62 +272,54 @@
   }
 
   // With -identifiernamestring for reflective methods
-  private static void test2_rule3(DexInspector inspector) {
+  private static void test2_rule3(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("identifiernamestring.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    assertTrue(main.isPresent());
-    Code mainCode = main.getMethod().getCode();
-    assertTrue(mainCode.isDexCode());
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
 
     ClassSubject b = inspector.clazz("identifiernamestring.B");
-    Set<Instruction> constStringInstructions =
-        getRenamedMemberIdentifierConstStrings(b, mainCode.asDexCode().instructions);
+    Set<InstructionSubject> constStringInstructions =
+        getRenamedMemberIdentifierConstStrings(b, foundMain);
     assertEquals(2, constStringInstructions.size());
   }
 
-  private static void verifyPresenceOfConstString(Instruction[] instructions) {
-    boolean presence =
-        Arrays.stream(instructions)
-            .anyMatch(instr -> instr instanceof ConstString || instr instanceof ConstStringJumbo);
-    assertTrue(presence);
+  private static void verifyPresenceOfConstString(FoundMethodSubject method) {
+    assertTrue(
+        method
+            .iterateInstructions(instruction -> instruction.isConstString(JumboStringMode.ALLOW))
+            .hasNext());
   }
 
-  private static String retrieveString(Instruction instr) {
-    if (instr instanceof ConstString) {
-      ConstString cnst = (ConstString) instr;
-      return cnst.getString().toString();
-    } else if (instr instanceof ConstStringJumbo) {
-      ConstStringJumbo cnst = (ConstStringJumbo) instr;
-      return cnst.getString().toString();
-    }
-    return null;
-  }
-
-  private static Stream<Instruction> getConstStringInstructions(Instruction[] instructions) {
-    return Arrays.stream(instructions)
-        .filter(instr -> instr instanceof ConstString || instr instanceof ConstStringJumbo);
+  private static Stream<InstructionSubject> getConstStringInstructions(FoundMethodSubject method) {
+    return Streams.stream(method.iterateInstructions())
+        .filter(instr -> instr.isConstString(JumboStringMode.ALLOW));
   }
 
   private static int countRenamedClassIdentifier(
-      DexInspector inspector, Instruction[] instructions) {
-    return getConstStringInstructions(instructions)
-        .reduce(0, (cnt, instr) -> {
-          String cnstString = retrieveString(instr);
-          assertNotNull(cnstString);
-          if (isValidJavaType(cnstString)) {
-            ClassSubject classSubject = inspector.clazz(cnstString);
-            if (classSubject.isRenamed()
-                && descriptorToJavaType(classSubject.getFinalDescriptor()).equals(cnstString)) {
-              return cnt + 1;
-            }
-          }
-          return cnt;
-        }, Integer::sum);
+      CodeInspector inspector, FoundMethodSubject method) {
+    return getConstStringInstructions(method)
+        .reduce(
+            0,
+            (cnt, instr) -> {
+              assert (instr instanceof ConstStringInstructionSubject);
+              String cnstString =
+                  ((ConstStringInstructionSubject) instr).getString().toSourceString();
+              if (isValidJavaType(cnstString)) {
+                ClassSubject classSubject = inspector.clazz(cnstString);
+                if (classSubject.isRenamed()
+                    && descriptorToJavaType(classSubject.getFinalDescriptor()).equals(cnstString)) {
+                  return cnt + 1;
+                }
+              }
+              return cnt;
+            },
+            Integer::sum);
   }
 
   private static int countRenamedClassIdentifier(
-      DexInspector inspector, DexEncodedField[] fields) {
+      CodeInspector inspector, DexEncodedField[] fields) {
     return Arrays.stream(fields)
         .filter(encodedField -> encodedField.getStaticValue() instanceof DexValueString)
         .reduce(0, (cnt, encodedField) -> {
@@ -316,22 +336,27 @@
         }, Integer::sum);
   }
 
-  private static Set<Instruction> getRenamedMemberIdentifierConstStrings(
-      ClassSubject clazz, Instruction[] instructions) {
-    Set<Instruction> result = Sets.newIdentityHashSet();
-    getConstStringInstructions(instructions).forEach(instr -> {
-      String cnstString = retrieveString(instr);
-      clazz.forAllMethods(foundMethodSubject -> {
-        if (foundMethodSubject.getFinalSignature().name.equals(cnstString)) {
-          result.add(instr);
-        }
-      });
-      clazz.forAllFields(foundFieldSubject -> {
-        if (foundFieldSubject.getFinalSignature().name.equals(cnstString)) {
-          result.add(instr);
-        }
-      });
-    });
+  private static Set<InstructionSubject> getRenamedMemberIdentifierConstStrings(
+      ClassSubject clazz, FoundMethodSubject method) {
+    Set<InstructionSubject> result = Sets.newIdentityHashSet();
+    getConstStringInstructions(method)
+        .forEach(
+            instr -> {
+              String cnstString =
+                  ((ConstStringInstructionSubject) instr).getString().toSourceString();
+              clazz.forAllMethods(
+                  foundMethodSubject -> {
+                    if (foundMethodSubject.getFinalSignature().name.equals(cnstString)) {
+                      result.add(instr);
+                    }
+                  });
+              clazz.forAllFields(
+                  foundFieldSubject -> {
+                    if (foundFieldSubject.getFinalSignature().name.equals(cnstString)) {
+                      result.add(instr);
+                    }
+                  });
+            });
     return result;
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
index 41e514a..28884cc 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
@@ -26,9 +26,9 @@
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
 import com.android.tools.r8.smali.SmaliTestBase;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -52,7 +52,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { java.lang.String aClassName; }",
         "-keep class " + CLASS_NAME,
         "-dontoptimize");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -84,7 +84,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { java.lang.String aClassName; }",
         "-keep class " + CLASS_NAME,
         "-dontoptimize");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -126,7 +126,7 @@
         "-keep class " + CLASS_NAME,
         "-keep,allowobfuscation class " + BOO,
         "-dontoptimize");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -163,7 +163,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sClassName; }",
         "-keep class " + CLASS_NAME,
         "-dontoptimize");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -194,7 +194,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sClassName; }",
         "-keep class " + CLASS_NAME,
         "-dontoptimize");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -232,7 +232,7 @@
         "-keep class " + CLASS_NAME,
         "-keep,allowobfuscation class " + BOO,
         "-dontoptimize");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -262,7 +262,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sClassName; }",
         "-keep class " + CLASS_NAME + " { static java.lang.String sClassName; }",
         "-dontshrink");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -284,7 +284,7 @@
         "-keep class " + CLASS_NAME + " { static java.lang.String sClassName; }",
         "-keep,allowobfuscation class " + BOO,
         "-dontshrink");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -308,7 +308,7 @@
         "-keep class " + CLASS_NAME + " { static java.lang.String sFieldName; }",
         "-keep,allowobfuscation class " + BOO + " { <fields>; }",
         "-dontshrink");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -332,7 +332,7 @@
         "-keep class " + CLASS_NAME + " { static java.lang.String sMethodName; }",
         "-keep,allowobfuscation class " + BOO + " { <methods>; }",
         "-dontshrink");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -362,7 +362,7 @@
     List<String> pgConfigs = ImmutableList.of(
         "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
         "-keep class " + CLASS_NAME);
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -404,7 +404,7 @@
     List<String> pgConfigs = ImmutableList.of(
         "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
         "-keep class " + CLASS_NAME);
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -450,7 +450,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
         "-keep class " + CLASS_NAME,
         "-keep,allowobfuscation class " + BOO);
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -504,7 +504,7 @@
             + "}",
         "-keep class " + CLASS_NAME,
         "-keep class R { *; }");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -554,7 +554,7 @@
             + "}",
         "-keep class " + CLASS_NAME,
         "-keep,allowobfuscation class R { *; }");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -611,7 +611,7 @@
             + "}",
         "-keep class " + CLASS_NAME,
         "-keep class R { *; }");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -672,7 +672,7 @@
             + "}",
         "-keep class " + CLASS_NAME,
         "-keep,allowobfuscation class R { *; }");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -696,8 +696,8 @@
     assertNotEquals("foo", constString.getString().toString());
   }
 
-  private DexInspector getInspectorAfterRunR8(
+  private CodeInspector getInspectorAfterRunR8(
       SmaliBuilder builder, List<String> proguardConfigurations) throws Exception {
-    return new DexInspector(runR8(builder, proguardConfigurations));
+    return new CodeInspector(runR8(builder, proguardConfigurations));
   }
 }
diff --git a/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java b/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java
index c7c74e9..02bca3a 100644
--- a/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java
+++ b/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java
@@ -20,7 +20,6 @@
 import com.android.tools.r8.utils.FileUtils;
 import java.io.IOException;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -129,7 +128,7 @@
     Path outPg = temp.getRoot().toPath().resolve(outName);
     ProcessResult proguardResult =
         ToolHelper.runProguard6Raw(
-            inputJar, outPg, Paths.get(ToolHelper.JAVA_8_RUNTIME), pgConfig, null);
+            inputJar, outPg, ToolHelper.getJava8RuntimeJar(), pgConfig, null);
     System.out.println(proguardResult.stdout);
     if (proguardResult.exitCode != 0) {
       System.out.println(proguardResult.stderr);
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
index e081f18..a5bbdf6 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
@@ -29,8 +29,8 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.util.Arrays;
@@ -303,12 +303,12 @@
   public void runTest(
       ImmutableMap<String, String> signatures,
       Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<DexInspector> inspect)
+      Consumer<CodeInspector> inspect)
       throws Exception {
     DiagnosticsChecker checker = new DiagnosticsChecker();
     assert (backend == Backend.CF || backend == Backend.DEX);
-    DexInspector inspector =
-        new DexInspector(
+    CodeInspector inspector =
+        new CodeInspector(
             ToolHelper.runR8(
                 R8Command.builder(checker)
                     .addClassProgramData(dumpSimple(signatures.get("Simple")), Origin.unknown())
@@ -376,7 +376,7 @@
 
   private void testSingleClass(String name, String signature,
       Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<DexInspector> inspector)
+      Consumer<CodeInspector> inspector)
       throws Exception {
     ImmutableMap<String, String> signatures = ImmutableMap.of(name, signature);
     runTest(signatures, diagnostics, inspector);
@@ -390,7 +390,7 @@
     assertEquals(0, checker.warnings.size());
   }
 
-  private void noInspection(DexInspector inspector) {
+  private void noInspection(CodeInspector inspector) {
   }
 
   private void noSignatureAttribute(ClassSubject clazz) {
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
index 02ec163..c470661 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
@@ -30,9 +30,9 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.util.Arrays;
@@ -159,17 +159,17 @@
     return cw.toByteArray();
   }
 
-  private FieldSubject lookupAnX(DexInspector inspector) {
+  private FieldSubject lookupAnX(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("Fields");
     return clazz.field("java.lang.String", "anX");
   }
 
-  private FieldSubject lookupAnArrayOfX(DexInspector inspector) {
+  private FieldSubject lookupAnArrayOfX(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("Fields");
     return clazz.field("java.lang.String[]", "anArrayOfX");
   }
 
-  private FieldSubject lookupAFieldsOfX(DexInspector inspector) {
+  private FieldSubject lookupAFieldsOfX(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("Fields");
     return clazz.field("Fields", "aFieldsOfX");
   }
@@ -177,12 +177,12 @@
   public void runTest(
       ImmutableMap<String, String> signatures,
       Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<DexInspector> inspect)
+      Consumer<CodeInspector> inspect)
       throws Exception {
     DiagnosticsChecker checker = new DiagnosticsChecker();
     assert (backend == Backend.CF || backend == Backend.DEX);
-    DexInspector inspector =
-        new DexInspector(
+    CodeInspector inspector =
+        new CodeInspector(
             ToolHelper.runR8(
                 R8Command.builder(checker)
                     .addClassProgramData(dumpFields(signatures), Origin.unknown())
@@ -242,7 +242,7 @@
 
   private void testSingleField(String name, String signature,
       Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<DexInspector> inspector)
+      Consumer<CodeInspector> inspector)
       throws Exception {
     ImmutableMap<String, String> signatures = ImmutableMap.of(name, signature);
     runTest(signatures, diagnostics, inspector);
@@ -256,7 +256,7 @@
     assertEquals(0, checker.warnings.size());
   }
 
-  private void noInspection(DexInspector inspector) {
+  private void noInspection(CodeInspector inspector) {
   }
 
   private void noSignatureAttribute(FieldSubject field) {
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
index efc9855..aa5307d 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
@@ -33,9 +33,9 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.util.Arrays;
@@ -178,19 +178,19 @@
     return cw.toByteArray();
   }
 
-  private MethodSubject lookupGeneric(DexInspector inspector) {
+  private MethodSubject lookupGeneric(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("Methods");
     return clazz.method(
         "java.lang.Throwable", "generic", ImmutableList.of("java.lang.Throwable", "Methods$Inner"));
   }
 
-  private MethodSubject lookupParameterizedReturn(DexInspector inspector) {
+  private MethodSubject lookupParameterizedReturn(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("Methods");
     return clazz.method(
         "Methods$Inner", "parameterizedReturn", ImmutableList.of());
   }
 
-  private MethodSubject lookupParameterizedArguments(DexInspector inspector) {
+  private MethodSubject lookupParameterizedArguments(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("Methods");
     return clazz.method(
         "void", "parameterizedArguments", ImmutableList.of("java.lang.Throwable", "Methods$Inner"));
@@ -199,12 +199,12 @@
   public void runTest(
       ImmutableMap<String, String> signatures,
       Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<DexInspector> inspect)
+      Consumer<CodeInspector> inspect)
       throws Exception {
     DiagnosticsChecker checker = new DiagnosticsChecker();
     assert (backend == Backend.CF || backend == Backend.DEX);
-    DexInspector inspector =
-        new DexInspector(
+    CodeInspector inspector =
+        new CodeInspector(
             ToolHelper.runR8(
                 R8Command.builder(checker)
                     .addClassProgramData(dumpMethods(signatures), Origin.unknown())
@@ -263,7 +263,7 @@
 
   private void testSingleMethod(String name, String signature,
       Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<DexInspector> inspector)
+      Consumer<CodeInspector> inspector)
       throws Exception {
     ImmutableMap<String, String> signatures = ImmutableMap.of(name, signature);
     runTest(signatures, diagnostics, inspector);
@@ -277,7 +277,7 @@
     assertEquals(0, checker.warnings.size());
   }
 
-  private void noInspection(DexInspector inspector) {
+  private void noInspection(CodeInspector inspector) {
   }
 
   private void noSignatureAttribute(MethodSubject method) {
diff --git a/src/test/java/com/android/tools/r8/naming/WarnReflectiveAccessTest.java b/src/test/java/com/android/tools/r8/naming/WarnReflectiveAccessTest.java
index 25e2358..829cdd0 100644
--- a/src/test/java/com/android/tools/r8/naming/WarnReflectiveAccessTest.java
+++ b/src/test/java/com/android/tools/r8/naming/WarnReflectiveAccessTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -21,8 +21,8 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.KeepingDiagnosticHandler;
 import com.android.tools.r8.utils.Reporter;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Method;
 import java.nio.file.Path;
@@ -113,8 +113,8 @@
         enableMinification, forceProguardCompatibility);
 
     String main = WarnReflectiveAccessTestMain.class.getCanonicalName();
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject mainSubject = dexInspector.clazz(main);
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject mainSubject = codeInspector.clazz(main);
     assertThat(mainSubject, isPresent());
 
     ProcessResult javaOutput = runOnJavaRaw(main, classes);
diff --git a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
index 4e46637..fd38d36 100644
--- a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
+++ b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.naming.b72391662;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -17,9 +17,9 @@
 import com.android.tools.r8.naming.b72391662.subpackage.OtherPackageTestClass;
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import java.util.List;
@@ -60,9 +60,9 @@
     AndroidApp app = runShrinkerRaw(shrinker, CLASSES, config);
     assertEquals("123451234567\nABC\n", runOnArt(app, mainClass.getCanonicalName()));
 
-    DexInspector dexInspector =
-        isR8(shrinker) ? new DexInspector(app) : new DexInspector(app, proguardMap);
-    ClassSubject testClass = dexInspector.clazz(TestClass.class);
+    CodeInspector codeInspector =
+        isR8(shrinker) ? new CodeInspector(app) : new CodeInspector(app, proguardMap);
+    ClassSubject testClass = codeInspector.clazz(TestClass.class);
     assertThat(testClass, isPresent());
 
     // Test the totally unused method.
@@ -150,9 +150,9 @@
     AndroidApp app = runShrinkerRaw(shrinker, CLASSES, config);
     assertEquals("123451234567\nABC\n", runOnArt(app, mainClass.getCanonicalName()));
 
-    DexInspector dexInspector =
-        isR8(shrinker) ? new DexInspector(app) : new DexInspector(app, proguardMap);
-    ClassSubject testClass = dexInspector.clazz(TestClass.class);
+    CodeInspector codeInspector =
+        isR8(shrinker) ? new CodeInspector(app) : new CodeInspector(app, proguardMap);
+    ClassSubject testClass = codeInspector.clazz(TestClass.class);
     assertThat(testClass, isPresent());
 
     // Test the totally unused method.
@@ -247,9 +247,9 @@
     AndroidApp app = runShrinkerRaw(shrinker, CLASSES, config);
     assertEquals("123451234567\nABC\n", runOnArt(app, mainClass.getCanonicalName()));
 
-    DexInspector dexInspector =
-        isR8(shrinker) ? new DexInspector(app) : new DexInspector(app, proguardMap);
-    ClassSubject testClass = dexInspector.clazz(TestClass.class);
+    CodeInspector codeInspector =
+        isR8(shrinker) ? new CodeInspector(app) : new CodeInspector(app, proguardMap);
+    ClassSubject testClass = codeInspector.clazz(TestClass.class);
     assertThat(testClass, isPresent());
 
     // Test the totally unused method.
diff --git a/src/test/java/com/android/tools/r8/naming/b80083341/B80083341.java b/src/test/java/com/android/tools/r8/naming/b80083341/B80083341.java
index 1b7d842..9791142 100644
--- a/src/test/java/com/android/tools/r8/naming/b80083341/B80083341.java
+++ b/src/test/java/com/android/tools/r8/naming/b80083341/B80083341.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.naming.b80083341;
 
 import static com.android.tools.r8.utils.DescriptorUtils.getClassNameFromDescriptor;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -12,8 +12,8 @@
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.VmTestRunner;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -40,7 +40,7 @@
         PackagePrivateClass.class, PackagePrivateClass.Itf.class, PackagePrivateClass.Impl.class
     ));
     AndroidApp processedApp = compileWithR8(app, String.join(System.lineSeparator(), config));
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject mainSubject = inspector.clazz(mainClass);
     assertThat(mainSubject, isPresent());
 
diff --git a/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java b/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java
index 0feddfd..f289674 100644
--- a/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java
+++ b/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java
@@ -18,8 +18,8 @@
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
@@ -60,8 +60,8 @@
     Path out = temp.getRoot().toPath();
     AndroidApp processedApp = runR8(originalApp, FieldUpdater.class, out, overloadaggressively);
 
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject a = dexInspector.clazz(A.class.getCanonicalName());
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject a = codeInspector.clazz(A.class.getCanonicalName());
     DexEncodedField f1 = a.field("int", "f1").getField();
     assertNotNull(f1);
     DexEncodedField f2 = a.field("java.lang.Object", "f2").getField();
@@ -112,8 +112,8 @@
     Path out = temp.getRoot().toPath();
     AndroidApp processedApp = runR8(originalApp, FieldResolution.class, out, overloadaggressively);
 
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject a = dexInspector.clazz(A.class.getCanonicalName());
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject a = codeInspector.clazz(A.class.getCanonicalName());
     DexEncodedField f1 = a.field("int", "f1").getField();
     assertNotNull(f1);
     DexEncodedField f3 = a.field(B.class.getCanonicalName(), "f3").getField();
@@ -157,8 +157,8 @@
     Path out = temp.getRoot().toPath();
     AndroidApp processedApp = runR8(originalApp, MethodResolution.class, out, overloadaggressively);
 
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject b = dexInspector.clazz(B.class.getCanonicalName());
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject b = codeInspector.clazz(B.class.getCanonicalName());
     DexEncodedMethod m1 =
         b.method("int", "getF1", ImmutableList.of()).getMethod();
     assertNotNull(m1);
diff --git a/src/test/java/com/android/tools/r8/naming/overloadaggressively/ValidNameConflictTest.java b/src/test/java/com/android/tools/r8/naming/overloadaggressively/ValidNameConflictTest.java
index 6e3e30a..efead2d 100644
--- a/src/test/java/com/android/tools/r8/naming/overloadaggressively/ValidNameConflictTest.java
+++ b/src/test/java/com/android/tools/r8/naming/overloadaggressively/ValidNameConflictTest.java
@@ -14,10 +14,10 @@
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.jasmin.JasminTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import java.util.List;
@@ -94,8 +94,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
     FieldSubject f1 = clazz.field("java.lang.String", "same");
     assertTrue(f1.isPresent());
@@ -122,8 +122,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
     FieldSubject f1 = clazz.field("java.lang.String", "same");
     assertTrue(f1.isPresent());
@@ -152,8 +152,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
     FieldSubject f1 = clazz.field("java.lang.String", "same");
     assertTrue(f1.isPresent());
@@ -179,8 +179,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
     FieldSubject f1 = clazz.field("java.lang.String", "same");
     assertTrue(f1.isPresent());
@@ -207,8 +207,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
     FieldSubject f1 = clazz.field("java.lang.String", "same");
     assertTrue(f1.isPresent());
@@ -263,8 +263,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(ANOTHER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(clazz.isPresent());
     MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -291,8 +291,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(ANOTHER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(clazz.isPresent());
     MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -321,8 +321,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(ANOTHER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(clazz.isPresent());
     MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -348,8 +348,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(ANOTHER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(clazz.isPresent());
     MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -376,8 +376,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(ANOTHER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(clazz.isPresent());
     MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -445,8 +445,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject sup = dexInspector.clazz(SUPER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
     assertTrue(sup.isPresent());
     MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -456,7 +456,7 @@
     assertFalse(m2.isRenamed());
     assertEquals(m1.getFinalName(), m2.getFinalName());
 
-    ClassSubject sub = dexInspector.clazz(ANOTHER_CLASS);
+    ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(sub.isPresent());
     MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(subM1.isPresent());
@@ -487,8 +487,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject sup = dexInspector.clazz(SUPER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
     assertTrue(sup.isPresent());
     MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -498,7 +498,7 @@
     assertTrue(m2.isRenamed());
     assertEquals(m1.getFinalName(), m2.getFinalName());
 
-    ClassSubject sub = dexInspector.clazz(ANOTHER_CLASS);
+    ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(sub.isPresent());
     MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(subM1.isPresent());
@@ -531,8 +531,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject sup = dexInspector.clazz(SUPER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
     assertTrue(sup.isPresent());
     MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -542,7 +542,7 @@
     assertTrue(m2.isRenamed());
     assertEquals(m1.getFinalName(), m2.getFinalName());
 
-    ClassSubject sub = dexInspector.clazz(ANOTHER_CLASS);
+    ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(sub.isPresent());
     MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(subM1.isPresent());
@@ -572,8 +572,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject sup = dexInspector.clazz(SUPER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
     assertTrue(sup.isPresent());
     MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -583,7 +583,7 @@
     assertTrue(m2.isRenamed());
     assertNotEquals(m1.getFinalName(), m2.getFinalName());
 
-    ClassSubject sub = dexInspector.clazz(ANOTHER_CLASS);
+    ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(sub.isPresent());
     MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(subM1.isPresent());
@@ -614,9 +614,9 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
+    CodeInspector codeInspector = new CodeInspector(app);
 
-    ClassSubject sup = dexInspector.clazz(SUPER_CLASS);
+    ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
     assertTrue(sup.isPresent());
     MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -626,7 +626,7 @@
     assertTrue(m2.isRenamed());
     assertEquals(m1.getFinalName(), m2.getFinalName());
 
-    ClassSubject sub = dexInspector.clazz(ANOTHER_CLASS);
+    ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(sub.isPresent());
     MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(subM1.isPresent());
diff --git a/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java b/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
index 8ae31f7..73dcdb3 100644
--- a/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
+++ b/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
@@ -7,31 +7,61 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import com.android.tools.r8.ClassFileConsumer;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.cf.code.CfStackInstruction.Opcode;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.DexInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CfInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.DexInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject.JumboStringMode;
+import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.function.BiConsumer;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
+@RunWith(Parameterized.class)
 public class NeverReturnsNormallyTest extends TestBase {
+
+  private Backend backend;
+
+  @Parameters(name = "Backend: {0}")
+  public static Collection<Backend> data() {
+    return Arrays.asList(Backend.values());
+  }
+
+  public NeverReturnsNormallyTest(Backend backend) {
+    this.backend = backend;
+  }
+
   private void runTest(
-      BiConsumer<DexInspector, CompilationMode> inspection,
+      BiConsumer<CodeInspector, CompilationMode> inspection,
       boolean enableClassInliner, CompilationMode mode) throws Exception {
     R8Command.Builder builder = R8Command.builder();
     builder.addProgramFiles(ToolHelper.getClassFileForTestClass(TestClass.class));
-    builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
+    assert (backend == Backend.DEX || backend == Backend.CF);
+    builder.setProgramConsumer(
+        backend == Backend.DEX
+            ? DexIndexedConsumer.emptyConsumer()
+            : ClassFileConsumer.emptyConsumer());
+    builder.addLibraryFiles(
+        backend == Backend.DEX
+            ? ToolHelper.getDefaultAndroidJar()
+            : ToolHelper.getJava8RuntimeJar());
     builder.setMode(mode);
     builder.addProguardConfiguration(
         ImmutableList.of(
@@ -47,18 +77,28 @@
             "}",
             "",
             "-dontobfuscate",
-            "-allowaccessmodification"
-        ),
+            "-allowaccessmodification"),
         Origin.unknown());
-    AndroidApp app = ToolHelper.runR8(builder.build(),
-        opts -> opts.enableClassInlining = enableClassInliner);
-    inspection.accept(new DexInspector(app), mode);
+    AndroidApp app =
+        ToolHelper.runR8(builder.build(), opts -> opts.enableClassInlining = enableClassInliner);
+    inspection.accept(
+        new CodeInspector(
+            app,
+            options -> {
+              options.enableCfFrontend = true;
+            }),
+        mode);
 
-    // Run on Art to check generated code against verifier.
-    runOnArt(app, TestClass.class);
+    if (backend == Backend.DEX) {
+      // Run on Art to check generated code against verifier.
+      runOnArt(app, TestClass.class);
+    } else {
+      runOnJava(app, TestClass.class);
+    }
   }
 
-  private void validate(DexInspector inspector, CompilationMode mode) {
+  private void validate(CodeInspector inspector, CompilationMode mode) {
+    assert (backend == Backend.DEX || backend == Backend.CF);
     ClassSubject clazz = inspector.clazz(TestClass.class);
     assertTrue(clazz.isPresent());
 
@@ -78,39 +118,34 @@
     assertTrue(methodThrowToBeInlined.isPresent());
     Iterator<InstructionSubject> instructions = methodThrowToBeInlined.iterateInstructions();
     // Call, followed by throw null.
-    assertTrue(nextInstruction(instructions).isConstString());
-    InstructionSubject insn = nextInstruction(instructions);
+    InstructionSubject insn = nextInstructionSkippingCfPositionAndLabel(instructions);
+    assertTrue(insn != null && insn.isConstString(JumboStringMode.ALLOW));
+    insn = nextInstruction(instructions);
     assertTrue(insn.isInvoke());
     assertTrue(((InvokeInstructionSubject) insn)
         .invokedMethod().name.toString().equals("throwNpe"));
-    insn = nextInstruction(instructions);
-    assertTrue(insn instanceof DexInstructionSubject && ((DexInstructionSubject) insn).isConst4());
-    assertTrue(nextInstruction(instructions).isThrow());
-    assertFalse(instructions.hasNext());
+    verifyTrailingPattern(instructions);
 
     // Check the instruction used for testInlinedIntoVoidMethod
     MethodSubject methodTestInlinedIntoVoidMethod =
         clazz.method("void", "testInlinedIntoVoidMethod", ImmutableList.of());
     assertTrue(methodTestInlinedIntoVoidMethod.isPresent());
     instructions = methodTestInlinedIntoVoidMethod.iterateInstructions();
+    insn = nextInstructionSkippingCfPositionAndLabel(instructions);
     if (mode == CompilationMode.DEBUG) {
       // Not inlined call to throwToBeInlined.
-      insn = nextInstruction(instructions);
       assertTrue(insn.isInvoke());
       assertTrue(((InvokeInstructionSubject) insn)
           .invokedMethod().name.toString().equals("throwToBeInlined"));
     } else {
       // Inlined code from throwToBeInlined.
-      assertTrue(nextInstruction(instructions).isConstString());
+      assertTrue(insn.isConstString(JumboStringMode.ALLOW));
       insn = nextInstruction(instructions);
       assertTrue(insn.isInvoke());
       assertTrue(((InvokeInstructionSubject) insn)
           .invokedMethod().name.toString().equals("throwNpe"));
     }
-    insn = nextInstruction(instructions);
-    assertTrue(insn instanceof DexInstructionSubject && ((DexInstructionSubject) insn).isConst4());
-    assertTrue(nextInstruction(instructions).isThrow());
-    assertFalse(instructions.hasNext());
+    verifyTrailingPattern(instructions);
 
     // Check the instruction used for testInlinedIntoVoidMethod
     MethodSubject methodOuterTrivial =
@@ -118,14 +153,11 @@
     assertTrue(methodOuterTrivial.isPresent());
     instructions = methodOuterTrivial.iterateInstructions();
     // Call, followed by [nop, goto]
-    insn = nextInstruction(instructions);
+    insn = nextInstructionSkippingCfPositionAndLabel(instructions);
     assertTrue(insn.isInvoke());
     assertTrue(((InvokeInstructionSubject) insn)
         .invokedMethod().name.toString().equals("innerNotReachable"));
-    insn = nextInstruction(instructions);
-    assertTrue(insn instanceof DexInstructionSubject && ((DexInstructionSubject) insn).isConst4());
-    assertTrue(nextInstruction(instructions).isThrow());
-    assertFalse(instructions.hasNext());
+    verifyTrailingPattern(instructions);
   }
 
   private InstructionSubject nextInstruction(Iterator<InstructionSubject> instructions) {
@@ -133,6 +165,39 @@
     return instructions.next();
   }
 
+  private InstructionSubject nextInstructionSkippingCfPositionAndLabel(
+      Iterator<InstructionSubject> instructions) {
+    InstructionSubject insn = null;
+    while (instructions.hasNext()) {
+      insn = instructions.next();
+      if (!(insn instanceof CfInstructionSubject)) {
+        break;
+      }
+      CfInstructionSubject cfInsn = (CfInstructionSubject) insn;
+      if (!cfInsn.isLabel() && !cfInsn.isPosition()) {
+        break;
+      }
+    }
+    return insn;
+  }
+
+  private void verifyTrailingPattern(Iterator<InstructionSubject> instructions) {
+    InstructionSubject insn = nextInstruction(instructions);
+    if (backend == Backend.DEX) {
+      assertTrue(
+          insn instanceof DexInstructionSubject && ((DexInstructionSubject) insn).isConst4());
+    } else {
+      assertTrue(insn instanceof CfInstructionSubject);
+      assertTrue(((CfInstructionSubject) insn).isStackInstruction(Opcode.Pop));
+      assertTrue(instructions.hasNext());
+      insn = instructions.next();
+      assertTrue(insn instanceof CfInstructionSubject);
+      assertTrue(((CfInstructionSubject) insn).isConstNull());
+    }
+    assertTrue(nextInstruction(instructions).isThrow());
+    assertFalse(instructions.hasNext());
+  }
+
   @Test
   public void test() throws Exception {
     runTest(this::validate, true, CompilationMode.DEBUG);
diff --git a/src/test/java/com/android/tools/r8/regress/B76025099.java b/src/test/java/com/android/tools/r8/regress/B76025099.java
index 68f6fe0..c7a093f 100644
--- a/src/test/java/com/android/tools/r8/regress/B76025099.java
+++ b/src/test/java/com/android/tools/r8/regress/B76025099.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.regress;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -20,9 +20,9 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.io.File;
 import java.nio.file.Files;
@@ -104,7 +104,7 @@
 
   private void verifyFieldAccess(AndroidApp processedApp, ProcessResult jvmOutput)
       throws Exception {
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject impl = inspector.clazz(Impl.class);
     assertThat(impl, isPresent());
     MethodSubject init = impl.init(ImmutableList.of("java.lang.String"));
diff --git a/src/test/java/com/android/tools/r8/regress/Regress37740372.java b/src/test/java/com/android/tools/r8/regress/Regress37740372.java
index 1d2c6fe..e6ac9f8 100644
--- a/src/test/java/com/android/tools/r8/regress/Regress37740372.java
+++ b/src/test/java/com/android/tools/r8/regress/Regress37740372.java
@@ -18,8 +18,8 @@
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.util.Base64;
 import java.util.Set;
 import org.junit.Test;
@@ -129,7 +129,7 @@
   }
 
   private void checkApplicationOnlyHasJavaLangObject(AndroidApp app) throws Throwable {
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     inspector.forAllClasses(this::assertIsJavaLangObjet);
   }
 
diff --git a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
index abf43b2..91d8460 100644
--- a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
+++ b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.regress.b111250398;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -16,10 +16,10 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import org.junit.Test;
@@ -236,7 +236,7 @@
         .count();
   }
 
-  private void check(DexInspector inspector, int mfOnBGets, int msfOnBGets) {
+  private void check(CodeInspector inspector, int mfOnBGets, int msfOnBGets) {
     ClassSubject classA = inspector.clazz(A.class);
     assertThat(classA, isPresent());
     MethodSubject mfOnA = classA.method("void", "mf", ImmutableList.of());
@@ -293,20 +293,20 @@
 
   @Test
   public void testSeparateCompilation() throws Exception {
-    DexInspector inspector =
-        new DexInspector(compileWithD8(readClasses(A.class, B.class), this::releaseMode));
+    CodeInspector inspector =
+        new CodeInspector(compileWithD8(readClasses(A.class, B.class), this::releaseMode));
     check(inspector, 5, 5);
   }
 
   @Test
   public void testWholeProgram() throws Exception {
-    DexInspector inspector =
-        new DexInspector(compileWithR8(readClasses(A.class, B.class), this::releaseMode));
+    CodeInspector inspector =
+        new CodeInspector(compileWithR8(readClasses(A.class, B.class), this::releaseMode));
     check(inspector, 1, 1);
   }
 
   private void checkMixed(AndroidApp app) throws Exception{
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject classC = inspector.clazz(C.class);
     assertThat(classC, isPresent());
     MethodSubject totalDays = classC.method("int", "totalDays", ImmutableList.of());
@@ -341,7 +341,7 @@
   }
 
   private void checkDaggerSingleProviderGet(AndroidApp app) throws Exception {
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     MethodSubject get =
         inspector.clazz(SingleCheck.class).method("java.lang.Object", "get", ImmutableList.of());
     assertThat(get, isPresent());
diff --git a/src/test/java/com/android/tools/r8/regress/b69825683/Regress69825683Test.java b/src/test/java/com/android/tools/r8/regress/b69825683/Regress69825683Test.java
index 9cc17af..3421cfe 100644
--- a/src/test/java/com/android/tools/r8/regress/b69825683/Regress69825683Test.java
+++ b/src/test/java/com/android/tools/r8/regress/b69825683/Regress69825683Test.java
@@ -13,8 +13,8 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -34,7 +34,7 @@
         Origin.unknown());
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
     AndroidApp app = ToolHelper.runR8(builder.build(), o -> o.enableClassInlining = false);
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     List<FoundClassSubject> classes = inspector.allClasses();
 
     // Check that the synthetic class is still present.
@@ -67,7 +67,7 @@
         Origin.unknown());
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
     AndroidApp app = ToolHelper.runR8(builder.build(), o -> o.enableClassInlining = false);
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     List<FoundClassSubject> classes = inspector.allClasses();
 
     // Check that the synthetic class is still present.
diff --git a/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java b/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
index 448e472..a052d86 100644
--- a/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
+++ b/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
@@ -15,9 +15,9 @@
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
@@ -431,7 +431,7 @@
 
   private void checkPathParserMethods(AndroidApp app, Class testClass, int a, int b)
       throws Exception {
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     DexItemFactory factory = inspector.getFactory();
     ClassSubject clazz = inspector.clazz(testClass);
     MethodSubject drawArc = clazz.method(
@@ -484,7 +484,7 @@
       assert compiler == Tool.R8;
       app = compileWithR8(app, "-keep class * { *; }", o -> o.minApiLevel = apiLevel.getLevel());
     }
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     DexItemFactory factory = inspector.getFactory();
     ClassSubject clazz = inspector.clazz(testClass);
     MethodSubject arcToBezier = clazz.method(
diff --git a/src/test/java/com/android/tools/r8/resolution/B77944861.java b/src/test/java/com/android/tools/r8/resolution/B77944861.java
index a35adbc..2118b44 100644
--- a/src/test/java/com/android/tools/r8/resolution/B77944861.java
+++ b/src/test/java/com/android/tools/r8/resolution/B77944861.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.resolution;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -20,9 +20,9 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -64,8 +64,8 @@
     ProcessResult jvmOutput = ToolHelper.runJava(ImmutableList.of(jarPath), mainName);
     assertEquals(0, jvmOutput.exitCode);
     AndroidApp processedApp = runR8(readJar(jarPath), SomeView.class, out);
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject view = dexInspector.clazz("regress_77944861.SomeView");
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject view = codeInspector.clazz("regress_77944861.SomeView");
     assertThat(view, isPresent());
     String className = "regress_77944861.inner.TopLevelPolicy$MobileIconState";
     MethodSubject initView = view.method("java.lang.String", "get", ImmutableList.of(className));
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java b/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
index ca62dee..fff9ac3 100644
--- a/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
@@ -19,9 +19,9 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.function.Consumer;
@@ -149,7 +149,7 @@
         ImmutableList.of(testClass),
         keepMainProguardConfiguration(testClass, true, false),
         options -> options.enableInlining = false);
-    DexInspector x = new DexInspector(app);
+    CodeInspector x = new CodeInspector(app);
 
     ClassSubject clazz = x.clazz(ClassWithAssertions.class);
     assertTrue(clazz.isPresent());
@@ -166,6 +166,7 @@
     R8Command command =
         ToolHelper.prepareR8CommandBuilder(readClasses(ClassWithAssertions.class))
             .setMode(CompilationMode.DEBUG)
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setOutput(outputJar, OutputMode.ClassFile)
             .build();
     ToolHelper.runR8(command, consumer);
diff --git a/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java b/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java
index f92b1dc..16b7922 100644
--- a/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java
+++ b/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java
@@ -10,11 +10,11 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
 import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -65,8 +65,8 @@
 
     Path dexPath = outputPath.resolve("classes.dex");
 
-    DexInspector dexInspector = new DexInspector(dexPath);
-    ClassSubject classSubject = dexInspector.clazz("rewrite.LongCompare");
+    CodeInspector codeInspector = new CodeInspector(dexPath);
+    ClassSubject classSubject = codeInspector.clazz("rewrite.LongCompare");
     MethodSubject methodSubject = classSubject
         .method("int", "simpleCompare", Arrays.asList("long", "long"));
     // Check that exception handler is removed since it is no longer needed.
diff --git a/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java b/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java
index c3037f8..278bc8b 100644
--- a/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java
@@ -11,11 +11,11 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -75,8 +75,8 @@
 
     Path dexPath = outputPath.resolve("classes.dex");
 
-    DexInspector dexInspector = new DexInspector(dexPath);
-    ClassSubject classSubject = dexInspector.clazz("rewrite.RequireNonNull");
+    CodeInspector codeInspector = new CodeInspector(dexPath);
+    ClassSubject classSubject = codeInspector.clazz("rewrite.RequireNonNull");
     MethodSubject methodSubject = classSubject
         .method("java.lang.Object", "nonnullRemove", Collections.emptyList());
 
diff --git a/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java b/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
index 5fe2abd..d3784ee 100644
--- a/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
@@ -26,8 +26,8 @@
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import org.junit.Test;
 
 public class StaticValuesTest extends SmaliTestBase {
@@ -94,7 +94,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     // Test is running without tree-shaking, so the empty <clinit> is not removed.
     assertTrue(
         inspector.clazz("Test").clinit().getMethod().getCode().asDexCode().isEmptyVoidMethod());
@@ -178,7 +178,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     MethodSubject clinit = inspector.clazz("Test").clinit();
     // Nothing changed in the class initializer.
     assertEquals(5, clinit.getMethod().getCode().asDexCode().instructions.length);
@@ -219,7 +219,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     // Test is running without tree-shaking, so the empty <clinit> is not removed.
     assertTrue(
         inspector.clazz("Test").clinit().getMethod().getCode().asDexCode().isEmptyVoidMethod());
@@ -261,7 +261,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     // Test is running without tree-shaking, so the empty <clinit> is not removed.
     assertTrue(
         inspector.clazz("Test").clinit().getMethod().getCode().asDexCode().isEmptyVoidMethod());
@@ -311,7 +311,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     // Test is running without tree-shaking, so the empty <clinit> is not removed.
     assertTrue(
         inspector.clazz("Test").clinit().getMethod().getCode().asDexCode().isEmptyVoidMethod());
@@ -384,7 +384,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     assertTrue(inspector.clazz("Test").clinit().isPresent());
 
     DexValue value;
@@ -471,7 +471,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     assertTrue(inspector.clazz(className).isPresent());
     // Test is running without tree-shaking, so the empty <clinit> is not removed.
     assertTrue(
@@ -520,7 +520,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     assertTrue(inspector.clazz(className).isPresent());
     assertTrue(inspector.clazz(className).clinit().isPresent());
 
@@ -553,7 +553,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     MethodSubject clinit = inspector.clazz("Test").clinit();
     // Nothing changed in the class initializer.
     assertEquals(3, clinit.getMethod().getCode().asDexCode().instructions.length);
diff --git a/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingJarTest.java b/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingJarTest.java
index 7ea9cdd..bffcfc5 100644
--- a/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingJarTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingJarTest.java
@@ -19,8 +19,8 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -282,7 +282,7 @@
     appBuilder.addProgramFiles(ToolHelper.getClassFileForTestClass(CheckSwitchInTestClass.class));
     AndroidApp app = compileWithR8(appBuilder.build());
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     MethodSubject method = inspector.clazz("Test").method("int", "test", ImmutableList.of("int"));
     DexCode code = method.getMethod().getCode().asDexCode();
 
diff --git a/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
index 7eae052..b2bcb4e 100644
--- a/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Paths;
 import java.util.List;
@@ -45,7 +45,7 @@
         .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
         .build();
     AndroidApp result = ToolHelper.runR8(command);
-    DexInspector inspector = new DexInspector(result);
+    CodeInspector inspector = new CodeInspector(result);
     Assert.assertFalse(inspector.clazz(SWITCHMAP_CLASS_NAME).isPresent());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java b/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
index 9242842..89cbbbe 100644
--- a/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
@@ -9,7 +9,7 @@
 import com.android.tools.r8.shaking.classkinds.Enum;
 import com.android.tools.r8.shaking.classkinds.Interface;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
 import java.util.Collection;
@@ -59,7 +59,7 @@
       Assert.assertTrue(classes.isEmpty());
       return;
     }
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     HashSet<java.lang.Class<?>> expected = Sets.newHashSet(classes);
     CLASSES_TO_INCLUDE.forEach(c -> {
       Assert.assertEquals(expected.contains(c), inspector.clazz(c).isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java b/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java
index 5fa8edc..2b4865d 100644
--- a/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
@@ -17,8 +17,8 @@
 import com.android.tools.r8.naming.MemberNaming.FieldSignature;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
@@ -126,7 +126,7 @@
     assertThat(artResult.stdout, containsString(impl2.name));
     assertEquals(-1, artResult.stderr.indexOf("DoFieldPut"));
 
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject itf1Subject = inspector.clazz(itf1.name);
     assertThat(itf1Subject, isPresent());
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java b/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java
index 474af4d..12ef651 100644
--- a/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java
+++ b/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java
@@ -19,7 +19,6 @@
 import com.android.tools.r8.utils.FileUtils;
 import java.io.IOException;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -122,7 +121,7 @@
     Path outPg = temp.getRoot().toPath().resolve(outName);
     ProcessResult proguardResult =
         ToolHelper.runProguard6Raw(
-            inputJar, outPg, Paths.get(ToolHelper.JAVA_8_RUNTIME), pgConfig, null);
+            inputJar, outPg, ToolHelper.getJava8RuntimeJar(), pgConfig, null);
     System.out.println(proguardResult.stdout);
     if (proguardResult.exitCode != 0) {
       System.out.println(proguardResult.stderr);
diff --git a/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesTest.java b/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesTest.java
index c6ccc61..59098d3 100644
--- a/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesTest.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.shaking;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -14,6 +14,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import com.android.tools.r8.ClassFileConsumer;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.DataResourceProvider;
 import com.android.tools.r8.DexIndexedConsumer;
@@ -31,7 +32,7 @@
 import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.ByteStreams;
 import com.google.common.io.CharSource;
@@ -39,12 +40,16 @@
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.jar.JarOutputStream;
 import java.util.zip.ZipEntry;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
 class A {
   private static String buildClassName(String className) {
@@ -65,7 +70,20 @@
 
 }
 
+@RunWith(Parameterized.class)
 public class LibraryProvidedProguardRulesTest extends TestBase {
+
+  private Backend backend;
+
+  @Parameters(name = "Backend: {0}")
+  public static Collection<Backend> data() {
+    return Arrays.asList(Backend.values());
+  }
+
+  public LibraryProvidedProguardRulesTest(Backend backend) {
+    this.backend = backend;
+  }
+
   private void addTextJarEntry(JarOutputStream out, String name, String content) throws Exception {
     out.putNextEntry(new ZipEntry(name));
     ByteStreams.copy(
@@ -84,11 +102,19 @@
     }
 
     try {
-      R8Command command = (handler != null ? R8Command.builder(handler) : R8Command.builder())
-          .addProgramFiles(jar)
-          .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
-          .build();
-      return ToolHelper.runR8(command);
+      R8Command.Builder builder =
+          (handler != null ? R8Command.builder(handler) : R8Command.builder()).addProgramFiles(jar);
+      if (backend == Backend.DEX) {
+        builder
+            .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
+            .addLibraryFiles(ToolHelper.getDefaultAndroidJar());
+      } else {
+        assert backend == Backend.CF;
+        builder
+            .setProgramConsumer(ClassFileConsumer.emptyConsumer())
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar());
+      }
+      return ToolHelper.runR8(builder.build());
     } catch (CompilationFailedException e) {
       assertNotNull(handler);
       return null;
@@ -103,7 +129,7 @@
   @Test
   public void keepOnlyA() throws Exception {
     AndroidApp app = runTest("-keep class " + A.class.getTypeName() +" {}", null);
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     assertThat(inspector.clazz(A.class), isPresent());
     assertThat(inspector.clazz(B.class), not(isPresent()));
   }
@@ -111,7 +137,7 @@
   @Test
   public void keepOnlyB() throws Exception {
     AndroidApp app = runTest("-keep class **B {}", null);
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     assertThat(inspector.clazz(A.class), not(isPresent()));
     assertThat(inspector.clazz(B.class), isPresent());
   }
@@ -119,7 +145,7 @@
   @Test
   public void keepBoth() throws Exception {
     AndroidApp app = runTest("-keep class ** {}", null);
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     assertThat(inspector.clazz(A.class), isPresent());
     assertThat(inspector.clazz(B.class), isPresent());
   }
@@ -127,7 +153,7 @@
   @Test
   public void multipleFiles() throws Exception {
     AndroidApp app = runTest(ImmutableList.of("-keep class **A {}", "-keep class **B {}"), null);
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     assertThat(inspector.clazz(A.class), isPresent());
     assertThat(inspector.clazz(B.class), isPresent());
   }
@@ -186,10 +212,19 @@
   public void throwingDataResourceProvider() throws Exception {
     DiagnosticsChecker checker = new DiagnosticsChecker();
     try {
-      R8Command command = R8Command.builder(checker)
-          .addProgramResourceProvider(new TestProvider())
-          .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
-          .build();
+      R8Command.Builder builder =
+          R8Command.builder(checker).addProgramResourceProvider(new TestProvider());
+      if (backend == Backend.DEX) {
+        builder
+            .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
+            .addLibraryFiles(ToolHelper.getDefaultAndroidJar());
+      } else {
+        assert backend == Backend.CF;
+        builder
+            .setProgramConsumer(ClassFileConsumer.emptyConsumer())
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar());
+      }
+      builder.build();
       fail("Should not succeed");
     } catch (CompilationFailedException e) {
       DiagnosticsChecker.checkDiagnostic(
diff --git a/src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java b/src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java
index bce2e8b..3b5a830 100644
--- a/src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java
@@ -41,8 +41,14 @@
 @RunWith(Parameterized.class)
 public class PrintUsageTest {
 
+  private enum Backend {
+    CF,
+    DEX
+  }
+
   private static final String PRINT_USAGE_FILE_SUFFIX = "-print-usage.txt";
 
+  private final Backend backend;
   private final String test;
   private final String programFile;
   private final List<String> keepRulesFiles;
@@ -52,9 +58,11 @@
   public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
 
   public PrintUsageTest(
+      Backend backend,
       String test,
       List<String> keepRulesFiles,
       Consumer<PrintUsageInspector> inspection) {
+    this.backend = backend;
     this.test = test;
     this.programFile = ToolHelper.EXAMPLES_BUILD_DIR + test + ".jar";
     this.keepRulesFiles = keepRulesFiles;
@@ -64,22 +72,29 @@
   @Before
   public void runR8andGetPrintUsage() throws Exception {
     Path out = temp.getRoot().toPath();
-    R8Command command =
+    R8Command.Builder builder =
         ToolHelper.addProguardConfigurationConsumer(
                 R8Command.builder(),
                 pgConfig -> {
                   pgConfig.setPrintUsage(true);
                   pgConfig.setPrintUsageFile(out.resolve(test + PRINT_USAGE_FILE_SUFFIX));
                 })
-            .setOutput(out, OutputMode.DexIndexed)
             .addProgramFiles(Paths.get(programFile))
-            .addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get))
-            .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
-            .build();
-    ToolHelper.runR8(command, options -> {
-      // Disable inlining to make this test not depend on inlining decisions.
-      options.enableInlining = false;
-    });
+            .addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get));
+
+    if (backend == Backend.DEX) {
+      builder
+          .setOutput(out, OutputMode.DexIndexed)
+          .addLibraryFiles(ToolHelper.getDefaultAndroidJar());
+    } else {
+      builder.setOutput(out, OutputMode.ClassFile).addLibraryFiles(ToolHelper.getJava8RuntimeJar());
+    }
+    ToolHelper.runR8(
+        builder.build(),
+        options -> {
+          // Disable inlining to make this test not depend on inlining decisions.
+          options.enableInlining = false;
+        });
   }
 
   @Test
@@ -106,6 +121,7 @@
     inspections.put("shaking12:keep-rules-printusage.txt", PrintUsageTest::inspectShaking12);
 
     List<Object[]> testCases = new ArrayList<>();
+    for (Backend backend : Backend.values()) {
     Set<String> usedInspections = new HashSet<>();
     for (String test : tests) {
       File[] keepFiles = new File(ToolHelper.EXAMPLES_DIR + test)
@@ -115,11 +131,13 @@
         Consumer<PrintUsageInspector> inspection =
             getTestOptionalParameter(inspections, usedInspections, test, keepName);
         if (inspection != null) {
-          testCases.add(new Object[]{test, ImmutableList.of(keepFile.getPath()), inspection});
+            testCases.add(
+                new Object[] {backend, test, ImmutableList.of(keepFile.getPath()), inspection});
         }
       }
     }
-    assert usedInspections.size() == inspections.size();
+      assert usedInspections.size() == inspections.size();
+    }
     return testCases;
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
index 22b6790..748866e 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -31,7 +31,7 @@
 import com.android.tools.r8.utils.InternalOptions.PackageObfuscationMode;
 import com.android.tools.r8.utils.KeepingDiagnosticHandler;
 import com.android.tools.r8.utils.Reporter;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.File;
 import java.io.IOException;
@@ -1844,7 +1844,7 @@
           ImmutableList.of(proguardConfig, additionalProguardConfig),
           null);
       assertEquals(0, result.exitCode);
-      DexInspector proguardInspector = new DexInspector(readJar(proguardedJar));
+      CodeInspector proguardInspector = new CodeInspector(readJar(proguardedJar));
       assertEquals(1, proguardInspector.allClasses().size());
     }
   }
@@ -1867,7 +1867,7 @@
           ImmutableList.of(proguardConfig, additionalProguardConfig),
           null);
       assertEquals(0, result.exitCode);
-      DexInspector proguardInspector = new DexInspector(readJar(proguardedJar));
+      CodeInspector proguardInspector = new CodeInspector(readJar(proguardedJar));
       assertEquals(1, proguardInspector.allClasses().size());
     }
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
index 24d4ba5..9eb7815 100644
--- a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
@@ -17,10 +17,10 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundFieldSubject;
-import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundFieldSubject;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -137,7 +137,7 @@
         });
   }
 
-  protected static void checkSameStructure(DexInspector ref, DexInspector inspector) {
+  protected static void checkSameStructure(CodeInspector ref, CodeInspector inspector) {
     ref.forAllClasses(refClazz -> checkSameStructure(refClazz,
         inspector.clazz(refClazz.getDexClass().toSourceString())));
   }
@@ -167,18 +167,18 @@
   }
 
   protected void runTest(
-      Consumer<DexInspector> inspection,
+      Consumer<CodeInspector> inspection,
       BiConsumer<String, String> outputComparator,
-      BiConsumer<DexInspector, DexInspector> dexComparator,
+      BiConsumer<CodeInspector, CodeInspector> dexComparator,
       List<String> keepRulesFiles)
       throws Exception {
     runTest(inspection, outputComparator, dexComparator, keepRulesFiles, null);
   }
 
   protected void runTest(
-      Consumer<DexInspector> inspection,
+      Consumer<CodeInspector> inspection,
       BiConsumer<String, String> outputComparator,
-      BiConsumer<DexInspector, DexInspector> dexComparator,
+      BiConsumer<CodeInspector, CodeInspector> dexComparator,
       List<String> keepRulesFiles,
       Consumer<InternalOptions> optionsConsumer)
       throws Exception {
@@ -193,7 +193,7 @@
     if (backend == Backend.CF) {
       jarLibraries =
           ImmutableList.of(
-              Paths.get(ToolHelper.JAVA_8_RUNTIME),
+              ToolHelper.getJava8RuntimeJar(),
               Paths.get(ToolHelper.EXAMPLES_BUILD_DIR + "shakinglib.jar"));
     } else {
       jarLibraries =
@@ -218,8 +218,8 @@
         Assert.assertEquals(resultInput.toString(), resultOutput.toString());
       }
       if (inspection != null) {
-        DexInspector inspector =
-            new DexInspector(
+        CodeInspector inspector =
+            new CodeInspector(
                 out,
                 minify.isMinify()
                     ? proguardMap.toString()
@@ -249,8 +249,8 @@
       }
 
       if (dexComparator != null) {
-        DexInspector ref = new DexInspector(Paths.get(originalDex));
-        DexInspector inspector = new DexInspector(out,
+        CodeInspector ref = new CodeInspector(Paths.get(originalDex));
+        CodeInspector inspector = new CodeInspector(out,
             minify.isMinify() ? proguardMap.toString()
                 : null);
         dexComparator.accept(ref, inspector);
@@ -263,7 +263,7 @@
     }
 
     if (inspection != null) {
-      DexInspector inspector = new DexInspector(out,
+      CodeInspector inspector = new CodeInspector(out,
           minify.isMinify() ? proguardMap.toString()
               : null);
       inspection.accept(inspector);
diff --git a/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
index d739348..eab5197 100644
--- a/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
@@ -15,15 +15,15 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
 
 public class DefaultMethodsTest extends TestBase {
-  private void runTest(List<String> additionalKeepRules, Consumer<DexInspector> inspection)
+  private void runTest(List<String> additionalKeepRules, Consumer<CodeInspector> inspection)
       throws Exception {
     R8Command.Builder builder = R8Command.builder();
     builder.addProgramFiles(ToolHelper.getClassFileForTestClass(InterfaceWithDefaultMethods.class));
@@ -40,20 +40,20 @@
         Origin.unknown());
     builder.addProguardConfiguration(additionalKeepRules, Origin.unknown());
     AndroidApp app = ToolHelper.runR8(builder.build(), o -> o.enableClassInlining = false);
-    inspection.accept(new DexInspector(app));
+    inspection.accept(new CodeInspector(app));
   }
 
-  private void interfaceNotKept(DexInspector inspector) {
+  private void interfaceNotKept(CodeInspector inspector) {
     assertFalse(inspector.clazz(InterfaceWithDefaultMethods.class).isPresent());
   }
 
-  private void defaultMethodNotKept(DexInspector inspector) {
+  private void defaultMethodNotKept(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(InterfaceWithDefaultMethods.class);
     assertTrue(clazz.isPresent());
     assertFalse(clazz.method("int", "method", ImmutableList.of()).isPresent());
   }
 
-  private void defaultMethodKept(DexInspector inspector) {
+  private void defaultMethodKept(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(InterfaceWithDefaultMethods.class);
     assertTrue(clazz.isPresent());
     MethodSubject method = clazz.method("int", "method", ImmutableList.of());
@@ -61,7 +61,7 @@
     assertFalse(method.isAbstract());
   }
 
-  private void defaultMethodAbstract(DexInspector inspector) {
+  private void defaultMethodAbstract(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(InterfaceWithDefaultMethods.class);
     assertTrue(clazz.isPresent());
     MethodSubject method = clazz.method("int", "method", ImmutableList.of());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/InliningClassVersionTest.java b/src/test/java/com/android/tools/r8/shaking/examples/InliningClassVersionTest.java
index 7fcb318..ba0d468 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/InliningClassVersionTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/InliningClassVersionTest.java
@@ -17,7 +17,6 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.google.common.io.ByteStreams;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.Collections;
 import java.util.List;
 import org.junit.Test;
@@ -147,7 +146,7 @@
     ToolHelper.runR8(
         R8Command.builder()
             .addProgramFiles(inputJar)
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .addProguardConfiguration(keepRule, Origin.unknown())
             .setOutput(outputJar, OutputMode.ClassFile)
             .build());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking11Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking11Test.java
index f7889ee..f65c1d4 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking11Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking11Test.java
@@ -5,7 +5,7 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -53,24 +53,24 @@
         ImmutableList.of("src/test/examples/shaking11/keep-rules-keep-method.txt"));
   }
 
-  private static void shaking11OnlyOneClassKept(DexInspector dexInspector) {
-    Assert.assertFalse(dexInspector.clazz("shaking11.Subclass").isPresent());
-    Assert.assertTrue(dexInspector.clazz("shaking11.SubclassWithMethod").isPresent());
+  private static void shaking11OnlyOneClassKept(CodeInspector codeInspector) {
+    Assert.assertFalse(codeInspector.clazz("shaking11.Subclass").isPresent());
+    Assert.assertTrue(codeInspector.clazz("shaking11.SubclassWithMethod").isPresent());
   }
 
-  private static void shaking11BothMethodsKept(DexInspector dexInspector) {
+  private static void shaking11BothMethodsKept(CodeInspector codeInspector) {
     Assert.assertFalse(
-        dexInspector
+        codeInspector
             .clazz("shaking11.Subclass")
             .method("void", "aMethod", Collections.emptyList())
             .isPresent());
     Assert.assertTrue(
-        dexInspector
+        codeInspector
             .clazz("shaking11.SuperClass")
             .method("void", "aMethod", Collections.emptyList())
             .isPresent());
     Assert.assertTrue(
-        dexInspector
+        codeInspector
             .clazz("shaking11.SubclassWithMethod")
             .method("void", "aMethod", Collections.emptyList())
             .isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking12Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking12Test.java
index d58d975..710635d 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking12Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking12Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -54,7 +54,7 @@
         ImmutableList.of("src/test/examples/shaking12/keep-rules-printusage.txt"));
   }
 
-  private static void shaking12OnlyInstantiatedClassesHaveConstructors(DexInspector inspector) {
+  private static void shaking12OnlyInstantiatedClassesHaveConstructors(CodeInspector inspector) {
     ClassSubject animalClass = inspector.clazz("shaking12.AnimalClass");
     Assert.assertTrue(animalClass.isPresent());
     Assert.assertFalse(animalClass.method("void", "<init>", Collections.emptyList()).isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java
index 6cfcd87..2157cd3 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java
@@ -5,11 +5,11 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldAccessInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldAccessInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -49,7 +49,7 @@
         ImmutableList.of("src/test/examples/shaking13/keep-rules.txt"));
   }
 
-  private static void shaking13EnsureFieldWritesCorrect(DexInspector inspector) {
+  private static void shaking13EnsureFieldWritesCorrect(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("shaking13.Shaking");
     MethodSubject testMethod = mainClass.method("void", "fieldTest", Collections.emptyList());
     Assert.assertTrue(testMethod.isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking14Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking14Test.java
index 8ea939a..820afc2 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking14Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking14Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/shaking14/keep-rules.txt"));
   }
 
-  private static void shaking14EnsureRightStaticMethodsLive(DexInspector inspector) {
+  private static void shaking14EnsureRightStaticMethodsLive(CodeInspector inspector) {
     ClassSubject superclass = inspector.clazz("shaking14.Superclass");
     Assert.assertFalse(superclass.method("int", "aMethod", ImmutableList.of("int")).isPresent());
     Assert.assertFalse(
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java
index 1651fca..1dd353e 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java
@@ -5,10 +5,10 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -48,7 +48,7 @@
         ImmutableList.of("src/test/examples/shaking15/keep-rules.txt"));
   }
 
-  private static void shaking15testDictionary(DexInspector inspector) {
+  private static void shaking15testDictionary(CodeInspector inspector) {
     inspector.forAllClasses((clazz) -> checkClassAndMemberInDictionary(clazz));
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking17Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking17Test.java
index ba01d2f..fac36d6 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking17Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking17Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -45,7 +45,7 @@
         ImmutableList.of("src/test/examples/shaking17/keep-rules.txt"));
   }
 
-  private static void abstractMethodRemains(DexInspector inspector) {
+  private static void abstractMethodRemains(CodeInspector inspector) {
     ClassSubject programClass = inspector.clazz("shaking17.AbstractProgramClass");
     Assert.assertTrue(programClass.isPresent());
     Assert.assertTrue(
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking18Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking18Test.java
index 26ea045..b691046 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking18Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking18Test.java
@@ -5,7 +5,7 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -43,7 +43,7 @@
         ImmutableList.of("src/test/examples/shaking18/keep-rules.txt"));
   }
 
-  private static void unusedRemoved(DexInspector inspector) {
+  private static void unusedRemoved(CodeInspector inspector) {
     // TODO(b/80455722): Change to assertFalse when tree-shaking detects this case.
     Assert.assertTrue(
         "DerivedUnused should be removed", inspector.clazz("shaking18.DerivedUnused").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java
index 0c662bb..f30bcac 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java
@@ -3,15 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.examples;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -52,7 +52,7 @@
         opt -> opt.enableClassMerging = false);
   }
 
-  private static void unusedRemoved(DexInspector inspector) {
+  private static void unusedRemoved(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("shaking19.Shaking$A");
     assertThat(clazz, isPresent());
 
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking1Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking1Test.java
index 6b90ec9..17cfb7f 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking1Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking1Test.java
@@ -6,8 +6,8 @@
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
 import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -165,7 +165,7 @@
             "src/test/proguard/valid/empty.flags"));
   }
 
-  private static void shaking1IsCorrectlyRepackaged(DexInspector inspector) {
+  private static void shaking1IsCorrectlyRepackaged(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz -> {
           String descriptor = clazz.getFinalDescriptor();
@@ -176,7 +176,7 @@
         });
   }
 
-  private static void shaking1HasNoClassUnused(DexInspector inspector) {
+  private static void shaking1HasNoClassUnused(CodeInspector inspector) {
     Assert.assertFalse(inspector.clazz("shaking1.Unused").isPresent());
     ClassSubject used = inspector.clazz("shaking1.Used");
     Assert.assertTrue(used.isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking2Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking2Test.java
index 4c2cfe1..5f87781 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking2Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking2Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -60,7 +60,7 @@
         null, null, null, ImmutableList.of("src/test/examples/shaking2/keep-rules-printusage.txt"));
   }
 
-  private static void shaking2SuperClassIsAbstract(DexInspector inspector) {
+  private static void shaking2SuperClassIsAbstract(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("shaking2.SuperClass");
     Assert.assertTrue(clazz.isAbstract());
     Assert.assertTrue(clazz.method("void", "virtualMethod", Collections.emptyList()).isAbstract());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking3Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking3Test.java
index 3996622..6ed0099 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking3Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking3Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -89,12 +89,12 @@
         ImmutableList.of("src/test/examples/shaking3/keep-no-abstract-classes.txt"));
   }
 
-  private static void shaking3HasNoPrivateClass(DexInspector inspector) {
+  private static void shaking3HasNoPrivateClass(CodeInspector inspector) {
     Assert.assertTrue(inspector.clazz("shaking3.B").isPresent());
     Assert.assertFalse(inspector.clazz("shaking3.AnAbstractClass").isPresent());
   }
 
-  private static void shaking3HasNoClassB(DexInspector inspector) {
+  private static void shaking3HasNoClassB(CodeInspector inspector) {
     Assert.assertFalse(inspector.clazz("shaking3.B").isPresent());
     ClassSubject classA = inspector.clazz("shaking3.A");
     Assert.assertTrue(classA.isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking5Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking5Test.java
index ad13070..7484255 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking5Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking5Test.java
@@ -5,7 +5,7 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/shaking5/keep-rules.txt"));
   }
 
-  private static void shaking5Inspection(DexInspector inspector) {
+  private static void shaking5Inspection(CodeInspector inspector) {
     Assert.assertFalse(
         inspector
             .clazz("shaking5.Superclass")
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking6Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking6Test.java
index 9fb2029..f5733cc 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking6Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking6Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -72,7 +72,7 @@
         ImmutableList.of("src/test/examples/shaking6/keep-public.txt"));
   }
 
-  private static void hasNoPublicMethodsButPrivate(DexInspector inspector) {
+  private static void hasNoPublicMethodsButPrivate(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz ->
             clazz.forAllMethods(
@@ -88,7 +88,7 @@
             .isPresent());
   }
 
-  private static void hasOnlyIntJustAMethod(DexInspector inspector) {
+  private static void hasOnlyIntJustAMethod(CodeInspector inspector) {
     Assert.assertFalse(
         inspector
             .clazz("shaking6.Superclass")
@@ -105,7 +105,7 @@
         subclass.method("int", "justAMethod", Collections.singletonList("double")).isPresent());
   }
 
-  private static void hasNoPrivateJustAMethod(DexInspector inspector) {
+  private static void hasNoPrivateJustAMethod(CodeInspector inspector) {
     Assert.assertFalse(
         inspector
             .clazz("shaking6.Superclass")
@@ -122,7 +122,7 @@
         subclass.method("int", "justAMethod", Collections.singletonList("double")).isPresent());
   }
 
-  private static void hasNoPrivateMethods(DexInspector inspector) {
+  private static void hasNoPrivateMethods(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz ->
             clazz.forAllMethods(
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking7Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking7Test.java
index b44f3aa..9d2faf3 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking7Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking7Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -71,7 +71,7 @@
         ImmutableList.of("src/test/examples/shaking7/keep-public-theIntField-fields.txt"));
   }
 
-  private static void shaking7HasOnlyDoubleFields(DexInspector inspector) {
+  private static void shaking7HasOnlyDoubleFields(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz -> {
           clazz.forAllFields(
@@ -86,7 +86,7 @@
     Assert.assertFalse(inspector.clazz("shaking7.Liar").field("int", "theDoubleField").isPresent());
   }
 
-  private static void shaking7HasOnlyPublicFieldsNamedTheIntField(DexInspector inspector) {
+  private static void shaking7HasOnlyPublicFieldsNamedTheIntField(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz -> {
           clazz.forAllFields(
@@ -104,7 +104,7 @@
     Assert.assertTrue(liar.field("double", "theIntField").isPresent());
   }
 
-  private static void shaking7HasOnlyPublicFields(DexInspector inspector) {
+  private static void shaking7HasOnlyPublicFields(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz -> {
           clazz.forAllFields(
@@ -120,7 +120,7 @@
     Assert.assertTrue(inspector.clazz("shaking7.Liar").field("int", "theDoubleField").isPresent());
   }
 
-  private static void shaking7HasOnlyPublicFieldsNamedTheDoubleField(DexInspector inspector) {
+  private static void shaking7HasOnlyPublicFieldsNamedTheDoubleField(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz -> {
           clazz.forAllFields(
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking8Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking8Test.java
index 02cda2a..b957c64 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking8Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking8Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -50,7 +50,7 @@
         null, null, null, ImmutableList.of("src/test/examples/shaking8/keep-rules-printusage.txt"));
   }
 
-  private static void shaking8ThingClassIsAbstractAndEmpty(DexInspector inspector) {
+  private static void shaking8ThingClassIsAbstractAndEmpty(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("shaking8.Thing");
     Assert.assertTrue(clazz.isAbstract());
     clazz.forAllMethods((method) -> Assert.fail());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking9Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking9Test.java
index 18a1141..e64abe1 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking9Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking9Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -50,7 +50,7 @@
         null, null, null, ImmutableList.of("src/test/examples/shaking9/keep-rules-printusage.txt"));
   }
 
-  private static void shaking9OnlySuperMethodsKept(DexInspector inspector) {
+  private static void shaking9OnlySuperMethodsKept(CodeInspector inspector) {
     ClassSubject superclass = inspector.clazz("shaking9.Superclass");
     Assert.assertTrue(superclass.isAbstract());
     Assert.assertTrue(superclass.method("void", "aMethod", ImmutableList.of()).isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java
index dfe1806..d7d45f0 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -68,7 +68,7 @@
         });
   }
 
-  private static void annotationRemovalHasNoInnerClassAnnotations(DexInspector inspector) {
+  private static void annotationRemovalHasNoInnerClassAnnotations(CodeInspector inspector) {
     ClassSubject outer = inspector.clazz("annotationremoval.OuterClass");
     Assert.assertTrue(outer.isPresent());
     Assert.assertTrue(outer.getDexClass().getInnerClasses().isEmpty());
@@ -86,7 +86,7 @@
     Assert.assertTrue(local.getDexClass().getInnerClasses().isEmpty());
   }
 
-  private static void annotationRemovalHasAllInnerClassAnnotations(DexInspector inspector) {
+  private static void annotationRemovalHasAllInnerClassAnnotations(CodeInspector inspector) {
     ClassSubject outer = inspector.clazz("annotationremoval.OuterClass");
     Assert.assertTrue(outer.isPresent());
     Assert.assertFalse(outer.getDexClass().getInnerClasses().isEmpty());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingEnumprotoTest.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingEnumprotoTest.java
index e544edf..7f211db 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingEnumprotoTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingEnumprotoTest.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/enumproto/keep-rules.txt"));
   }
 
-  private static void enumprotoUnusedFieldsAreGone(DexInspector inspector) {
+  private static void enumprotoUnusedFieldsAreGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("enumproto.GeneratedEnumProto$Enum");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertFalse(protoClass.field("int", "id_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto1Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto1Test.java
index 6650860..16b5f59 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto1Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto1Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/nestedproto1/keep-rules.txt"));
   }
 
-  private static void nestedproto1UnusedFieldsAreGone(DexInspector inspector) {
+  private static void nestedproto1UnusedFieldsAreGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("nestedproto1.GeneratedNestedProto$Outer");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertFalse(protoClass.field("int", "id_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto2Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto2Test.java
index d7a8af5..a679810 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto2Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto2Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/nestedproto2/keep-rules.txt"));
   }
 
-  private static void nestedproto2UnusedFieldsAreGone(DexInspector inspector) {
+  private static void nestedproto2UnusedFieldsAreGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("nestedproto2.GeneratedNestedProto$Outer");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertTrue(protoClass.field("int", "id_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingOneofprotoTest.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingOneofprotoTest.java
index 18f4648..e38258c 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingOneofprotoTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingOneofprotoTest.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/oneofproto/keep-rules.txt"));
   }
 
-  private static void oneofprotoUnusedFieldsAreGone(DexInspector inspector) {
+  private static void oneofprotoUnusedFieldsAreGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("oneofproto.GeneratedOneOfProto$Oneof");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertFalse(protoClass.field("int", "id_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingRepeatedprotoTest.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingRepeatedprotoTest.java
index e55d822..923cf34 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingRepeatedprotoTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingRepeatedprotoTest.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/repeatedproto/keep-rules.txt"));
   }
 
-  private static void repeatedUnusedFieldsAreGone(DexInspector inspector) {
+  private static void repeatedUnusedFieldsAreGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("repeatedproto.GeneratedRepeatedProto$Repeated");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertFalse(protoClass.field("int", "id_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto1Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto1Test.java
index 2b49803..64e3839 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto1Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto1Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/simpleproto1/keep-rules.txt"));
   }
 
-  private static void simpleproto1UnusedFieldIsGone(DexInspector inspector) {
+  private static void simpleproto1UnusedFieldIsGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("simpleproto1.GeneratedSimpleProto$Simple");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertFalse(protoClass.field("boolean", "other_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto2Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto2Test.java
index ce9659b..5304dae 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto2Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto2Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/simpleproto2/keep-rules.txt"));
   }
 
-  private static void simpleproto2UnusedFieldsAreGone(DexInspector inspector) {
+  private static void simpleproto2UnusedFieldsAreGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("simpleproto2.GeneratedSimpleProto$Simple");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertFalse(protoClass.field("int", "id_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
index 31c97ca..51baed2 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
@@ -38,10 +38,10 @@
 import com.android.tools.r8.utils.DefaultDiagnosticsHandler;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.Reporter;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import it.unimi.dsi.fastutil.objects.Object2BooleanArrayMap;
@@ -56,7 +56,7 @@
   private void test(Class mainClass, Class mentionedClass, boolean forceProguardCompatibility)
       throws Exception {
     String proguardConfig = keepMainProguardConfiguration(mainClass, true, false);
-    DexInspector inspector = new DexInspector(
+    CodeInspector inspector = new CodeInspector(
         compileWithR8(
             ImmutableList.of(mainClass, mentionedClass),
             proguardConfig,
@@ -103,7 +103,7 @@
     }
 
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(builder.build()));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(builder.build()));
     assertTrue(inspector.clazz(mainClass.getCanonicalName()).isPresent());
     ClassSubject clazz = inspector.clazz(getJavacGeneratedClassName(mentionedClassWithAnnotations));
     assertTrue(clazz.isPresent());
@@ -138,7 +138,7 @@
     builder.setProguardCompatibilityRulesOutput(proguardCompatibilityRules);
 
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(builder.build()));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(builder.build()));
     ClassSubject clazz = inspector.clazz(getJavacGeneratedClassName(testClass));
     assertTrue(clazz.isPresent());
     assertEquals(forceProguardCompatibility && hasDefaultConstructor,
@@ -195,7 +195,7 @@
     builder.addProguardConfiguration(proguardConfig, Origin.unknown());
 
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(builder.build()));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(builder.build()));
     assertTrue(inspector.clazz(getJavacGeneratedClassName(mainClass)).isPresent());
     ClassSubject clazz = inspector.clazz(getJavacGeneratedClassName(instantiatedClass));
     assertEquals(containsCheckCast, clazz.isPresent());
@@ -210,7 +210,7 @@
       FileUtils.writeTextFile(proguardConfigFile, proguardConfig);
       ToolHelper.runProguard(jarTestClasses(ImmutableList.of(mainClass, instantiatedClass)),
           proguardedJar, proguardConfigFile, null);
-      DexInspector proguardInspector = new DexInspector(readJar(proguardedJar));
+      CodeInspector proguardInspector = new CodeInspector(readJar(proguardedJar));
       assertTrue(proguardInspector.clazz(mainClass).isPresent());
       assertEquals(
           containsCheckCast, proguardInspector.clazz(instantiatedClass).isPresent());
@@ -257,7 +257,7 @@
     }
 
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(builder.build()));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(builder.build()));
     assertTrue(inspector.clazz(getJavacGeneratedClassName(mainClass)).isPresent());
     forNameClasses.forEach(clazz -> {
       ClassSubject subject = inspector.clazz(getJavacGeneratedClassName(clazz));
@@ -316,7 +316,7 @@
       ToolHelper.runProguard(jarTestClasses(
           ImmutableList.of(mainClass, forNameClass1, forNameClass2)),
           proguardedJar, proguardConfigFile, proguardMapFile);
-      DexInspector proguardedInspector = new DexInspector(readJar(proguardedJar), proguardMapFile);
+      CodeInspector proguardedInspector = new CodeInspector(readJar(proguardedJar), proguardMapFile);
       assertEquals(3, proguardedInspector.allClasses().size());
       assertTrue(proguardedInspector.clazz(mainClass).isPresent());
       for (Class clazz : ImmutableList.of(forNameClass1, forNameClass2)) {
@@ -360,7 +360,7 @@
     }
 
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(builder.build()));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(builder.build()));
     assertTrue(inspector.clazz(getJavacGeneratedClassName(mainClass)).isPresent());
     ClassSubject classSubject = inspector.clazz(getJavacGeneratedClassName(withMemberClass));
     // Due to the direct usage of .class
@@ -424,7 +424,7 @@
       ToolHelper.runProguard(jarTestClasses(
           ImmutableList.of(mainClass, withMemberClass)),
           proguardedJar, proguardConfigFile, proguardMapFile);
-      DexInspector proguardedInspector = new DexInspector(readJar(proguardedJar), proguardMapFile);
+      CodeInspector proguardedInspector = new CodeInspector(readJar(proguardedJar), proguardMapFile);
       assertEquals(2, proguardedInspector.allClasses().size());
       assertTrue(proguardedInspector.clazz(mainClass).isPresent());
       classSubject = proguardedInspector.clazz(withMemberClass);
@@ -473,7 +473,7 @@
     }
 
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(builder.build()));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(builder.build()));
     assertTrue(inspector.clazz(getJavacGeneratedClassName(mainClass)).isPresent());
     ClassSubject classSubject = inspector.clazz(getJavacGeneratedClassName(withVolatileFields));
     // Due to the direct usage of .class
@@ -541,7 +541,7 @@
       ToolHelper.runProguard(jarTestClasses(
           ImmutableList.of(mainClass, withVolatileFields)),
           proguardedJar, proguardConfigFile, proguardMapFile);
-      DexInspector proguardedInspector = new DexInspector(readJar(proguardedJar), proguardMapFile);
+      CodeInspector proguardedInspector = new CodeInspector(readJar(proguardedJar), proguardMapFile);
       assertEquals(2, proguardedInspector.allClasses().size());
       assertTrue(proguardedInspector.clazz(mainClass).isPresent());
       classSubject = proguardedInspector.clazz(withVolatileFields);
@@ -604,7 +604,7 @@
       assertTrue(!forceProguardCompatibility && (!innerClasses || !enclosingMethod));
       return;
     }
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     assertTrue(inspector.clazz(getJavacGeneratedClassName(mainClass)).isPresent());
     assertEquals(innerClasses || enclosingMethod ? "1" : "0", runOnArt(app, mainClass));
 
@@ -639,7 +639,7 @@
 
   private void runKeepDefaultMethodsTest(
       List<String> additionalKeepRules,
-      Consumer<DexInspector> inspection,
+      Consumer<CodeInspector> inspection,
       Consumer<ProguardConfiguration> compatInspection) throws Exception {
     Class mainClass = TestClass.class;
     CompatProguardCommandBuilder builder = new CompatProguardCommandBuilder();
@@ -657,7 +657,7 @@
     Path proguardCompatibilityRules = temp.newFile().toPath();
     builder.setProguardCompatibilityRulesOutput(proguardCompatibilityRules);
     AndroidApp app = ToolHelper.runR8(builder.build(), o -> o.enableClassInlining = false);
-    inspection.accept(new DexInspector(app));
+    inspection.accept(new CodeInspector(app));
     // Check the Proguard compatibility configuration generated.
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(new DexItemFactory(),
@@ -671,7 +671,7 @@
     assertEquals(0, configuration.getRules().size());
   }
 
-  private void defaultMethodKept(DexInspector inspector) {
+  private void defaultMethodKept(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(InterfaceWithDefaultMethods.class);
     assertTrue(clazz.isPresent());
     MethodSubject method = clazz.method("int", "method", ImmutableList.of());
@@ -695,7 +695,7 @@
     assertEquals(0, memberRule.getArguments().size());
   }
 
-  private void defaultMethod2Kept(DexInspector inspector) {
+  private void defaultMethod2Kept(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(InterfaceWithDefaultMethods.class);
     assertTrue(clazz.isPresent());
     MethodSubject method =
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatabilityTestBase.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatabilityTestBase.java
index f76d402..ef98898 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatabilityTestBase.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatabilityTestBase.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.forceproguardcompatibility;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
@@ -19,8 +19,8 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.File;
 import java.nio.file.Path;
@@ -67,12 +67,12 @@
     throw new IllegalArgumentException("Unknown shrinker: " + mode);
   }
 
-  protected DexInspector runShrinker(
+  protected CodeInspector runShrinker(
       Shrinker mode, List<Class> programClasses, List<String> proguadConfigs) throws Exception {
     return runShrinker(mode, programClasses, String.join(System.lineSeparator(), proguadConfigs));
   }
 
-  protected DexInspector runShrinker(
+  protected CodeInspector runShrinker(
       Shrinker mode, List<Class> programClasses, String proguardConfig) throws Exception {
     switch (mode) {
       case PROGUARD5:
@@ -104,8 +104,8 @@
     return ToolHelper.runR8(builder.build(), configure);
   }
 
-  protected DexInspector runR8(List<Class> programClasses, String proguardConfig) throws Exception {
-    return new DexInspector(runR8Raw(programClasses, proguardConfig));
+  protected CodeInspector runR8(List<Class> programClasses, String proguardConfig) throws Exception {
+    return new CodeInspector(runR8Raw(programClasses, proguardConfig));
   }
 
   protected AndroidApp runR8CompatRaw(
@@ -120,12 +120,12 @@
     return ToolHelper.runR8(builder.build());
   }
 
-  protected DexInspector runR8Compat(
+  protected CodeInspector runR8Compat(
       List<Class> programClasses, String proguardConfig) throws Exception {
-    return new DexInspector(runR8CompatRaw(programClasses, proguardConfig));
+    return new CodeInspector(runR8CompatRaw(programClasses, proguardConfig));
   }
 
-  protected DexInspector runR8CompatKeepingMain(Class mainClass, List<Class> programClasses)
+  protected CodeInspector runR8CompatKeepingMain(Class mainClass, List<Class> programClasses)
       throws Exception {
     return runR8Compat(programClasses, keepMainProguardConfiguration(mainClass));
   }
@@ -148,10 +148,10 @@
     return readJar(proguardedJar);
   }
 
-  protected DexInspector runProguard5(
+  protected CodeInspector runProguard5(
       List<Class> programClasses, String proguardConfig) throws Exception {
     proguardMap = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
-    return new DexInspector(
+    return new CodeInspector(
         runProguard5Raw(programClasses, proguardConfig, proguardMap), proguardMap);
   }
 
@@ -173,10 +173,10 @@
     return readJar(proguardedJar);
   }
 
-  protected DexInspector runProguard6(
+  protected CodeInspector runProguard6(
       List<Class> programClasses, String proguardConfig) throws Exception {
     proguardMap = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
-    return new DexInspector(
+    return new CodeInspector(
         runProguard6Raw(programClasses, proguardConfig, proguardMap), proguardMap);
   }
 
@@ -198,30 +198,30 @@
     return ToolHelper.runD8(readJar(proguardedJar));
   }
 
-  protected DexInspector runProguard6AndD8(
+  protected CodeInspector runProguard6AndD8(
       List<Class> programClasses, String proguardConfig) throws Exception {
     proguardMap = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
-    return new DexInspector(
+    return new CodeInspector(
         runProguard6AndD8Raw(programClasses, proguardConfig, proguardMap), proguardMap);
   }
 
-  protected DexInspector runProguardKeepingMain(Class mainClass, List<Class> programClasses)
+  protected CodeInspector runProguardKeepingMain(Class mainClass, List<Class> programClasses)
       throws Exception {
     return runProguard6AndD8(programClasses, keepMainProguardConfiguration(mainClass));
   }
 
   protected void verifyClassesPresent(
-      DexInspector dexInspector, Class<?>... classesOfInterest) {
+      CodeInspector codeInspector, Class<?>... classesOfInterest) {
     for (Class klass : classesOfInterest) {
-      ClassSubject c = dexInspector.clazz(klass);
+      ClassSubject c = codeInspector.clazz(klass);
       assertThat(c, isPresent());
     }
   }
 
   protected void verifyClassesAbsent(
-      DexInspector dexInspector, Class<?>... classesOfInterest) {
+      CodeInspector codeInspector, Class<?>... classesOfInterest) {
     for (Class klass : classesOfInterest) {
-      ClassSubject c = dexInspector.clazz(klass);
+      ClassSubject c = codeInspector.clazz(klass);
       assertThat(c, not(isPresent()));
     }
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
index d752e39..aed1423 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
@@ -4,16 +4,16 @@
 
 package com.android.tools.r8.shaking.forceproguardcompatibility.defaultctor;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.hasDefaultConstructor;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.hasDefaultConstructor;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.core.IsNot.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
 import com.android.tools.r8.smali.ConstantFoldingTest.TriConsumer;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -103,14 +103,14 @@
   }
 
   private void checkAllClassesPresentWithDefaultConstructor(
-      Class mainClass, List<Class> programClasses, DexInspector inspector) {
+      Class mainClass, List<Class> programClasses, CodeInspector inspector) {
     assert programClasses.contains(mainClass);
     assertEquals(programClasses.size(), inspector.allClasses().size());
     inspector.forAllClasses(this::checkPresentWithDefaultConstructor);
   }
 
   private void checkAllClassesPresentOnlyMainWithDefaultConstructor(
-      Class mainClass, List<Class> programClasses, DexInspector inspector) {
+      Class mainClass, List<Class> programClasses, CodeInspector inspector) {
     assert programClasses.contains(mainClass);
     assertEquals(programClasses.size(), inspector.allClasses().size());
     checkPresentWithDefaultConstructor(inspector.clazz(mainClass));
@@ -121,7 +121,7 @@
   }
 
   private void checkOnlyMainPresent(
-      Class mainClass, List<Class> programClasses, DexInspector inspector) {
+      Class mainClass, List<Class> programClasses, CodeInspector inspector) {
     assert programClasses.contains(mainClass);
     assertEquals(1, inspector.allClasses().size());
     inspector.forAllClasses(this::checkPresentWithDefaultConstructor);
@@ -129,9 +129,9 @@
 
   private void runTest(
       Class mainClass, List<Class> programClasses, String proguardConfiguration,
-      TriConsumer<Class, List<Class>, DexInspector> r8Checker,
-      TriConsumer<Class, List<Class>, DexInspector> proguardChecker) throws Exception {
-    DexInspector inspector = runR8Compat(programClasses, proguardConfiguration);
+      TriConsumer<Class, List<Class>, CodeInspector> r8Checker,
+      TriConsumer<Class, List<Class>, CodeInspector> proguardChecker) throws Exception {
+    CodeInspector inspector = runR8Compat(programClasses, proguardConfiguration);
     r8Checker.accept(mainClass, programClasses, inspector);
 
     if (isRunProguard()) {
@@ -144,7 +144,7 @@
 
   private void runTest(
       Class mainClass, List<Class> programClasses, String proguardConfiguration,
-      TriConsumer<Class, List<Class>, DexInspector> checker) throws Exception {
+      TriConsumer<Class, List<Class>, CodeInspector> checker) throws Exception {
     runTest(mainClass, programClasses, proguardConfiguration, checker, checker);
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
index e64983d..513a01a 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.ifrule;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
@@ -11,9 +11,9 @@
 
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
@@ -59,8 +59,8 @@
         "  public <methods>;",
         "}"
     );
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    ClassSubject classSubject = dexInspector.clazz(ClassForIf.class);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    ClassSubject classSubject = codeInspector.clazz(ClassForIf.class);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method(publicMethod);
     assertThat(methodSubject, not(isPresent()));
@@ -68,7 +68,7 @@
     assertThat(methodSubject, isPresent());
     assertTrue(methodSubject.getMethod().accessFlags.isPublic());
 
-    classSubject = dexInspector.clazz(ClassForSubsequent.class);
+    classSubject = codeInspector.clazz(ClassForSubsequent.class);
     if (isR8(shrinker)) {
       // TODO(b/72109068): ClassForIf#nonPublicMethod becomes public, and -if rule is not applied
       // at the 2nd tree shaking.
@@ -98,8 +98,8 @@
         "  !public <methods>;",
         "}"
     );
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    ClassSubject classSubject = dexInspector.clazz(ClassForIf.class);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    ClassSubject classSubject = codeInspector.clazz(ClassForIf.class);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method(publicMethod);
     assertThat(methodSubject, not(isPresent()));
@@ -107,7 +107,7 @@
     assertThat(methodSubject, isPresent());
     assertTrue(methodSubject.getMethod().accessFlags.isPublic());
 
-    classSubject = dexInspector.clazz(ClassForSubsequent.class);
+    classSubject = codeInspector.clazz(ClassForSubsequent.class);
     if (isR8(shrinker)) {
       // TODO(b/72109068): ClassForIf#nonPublicMethod becomes public, and -if rule is not applied
       // at the 2nd tree shaking.
@@ -138,15 +138,15 @@
         "  public <methods>;",
         "}"
     );
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    ClassSubject classSubject = dexInspector.clazz(ClassForIf.class);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    ClassSubject classSubject = codeInspector.clazz(ClassForIf.class);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method(publicMethod);
     assertThat(methodSubject, isPresent());
     methodSubject = classSubject.method(nonPublicMethod);
     assertThat(methodSubject, not(isPresent()));
 
-    classSubject = dexInspector.clazz(ClassForSubsequent.class);
+    classSubject = codeInspector.clazz(ClassForSubsequent.class);
     assertThat(classSubject, isPresent());
     methodSubject = classSubject.method(publicMethod);
     assertThat(methodSubject, isPresent());
@@ -170,15 +170,15 @@
         "  !public <methods>;",
         "}"
     );
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    ClassSubject classSubject = dexInspector.clazz(ClassForIf.class);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    ClassSubject classSubject = codeInspector.clazz(ClassForIf.class);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method(publicMethod);
     assertThat(methodSubject, isPresent());
     methodSubject = classSubject.method(nonPublicMethod);
     assertThat(methodSubject, not(isPresent()));
 
-    classSubject = dexInspector.clazz(ClassForSubsequent.class);
+    classSubject = codeInspector.clazz(ClassForSubsequent.class);
     assertThat(classSubject, isPresent());
     methodSubject = classSubject.method(publicMethod);
     assertThat(methodSubject, not(isPresent()));
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java
index ac92146..146c3cd 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.shaking.ifrule;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
@@ -50,10 +50,10 @@
         "-keep class **.UnusedAnnotation*"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         UnusedAnnotation.class, UnusedAnnotationDependent.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         UsedAnnotation.class, UsedAnnotationDependent.class);
   }
 
@@ -76,10 +76,10 @@
         "-keep class <1>.Unused<2>*"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         UnusedAnnotation.class, UnusedAnnotationDependent.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         UsedAnnotation.class, UsedAnnotationDependent.class);
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
index 1f5ba35..167c2f4 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
@@ -3,18 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.ifrule;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isNotRenamed;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -60,19 +60,19 @@
   }
 
   @Override
-  protected DexInspector runR8(
+  protected CodeInspector runR8(
       List<Class> programClasses, String proguardConfig) throws Exception {
     return super.runR8(programClasses, adaptConfiguration(proguardConfig));
   }
 
   @Override
-  protected DexInspector runProguard5(
+  protected CodeInspector runProguard5(
       List<Class> programClasses, String proguardConfig) throws Exception {
     return super.runProguard5(programClasses, adaptConfiguration(proguardConfig));
   }
 
   @Override
-  protected DexInspector runProguard6(
+  protected CodeInspector runProguard6(
       List<Class> programClasses, String proguardConfig) throws Exception {
     return super.runProguard6(programClasses, adaptConfiguration(proguardConfig));
   }
@@ -86,17 +86,17 @@
         "-keep,allowobfuscation class **.Dependent"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
     if (!keepPrecondition) {
       // TODO(b/73708139): Proguard6 kept Dependent (w/o any members), which is not necessary.
       if (shrinker == Shrinker.PROGUARD6) {
         return;
       }
-      assertEquals(1, dexInspector.allClasses().size());
+      assertEquals(1, codeInspector.allClasses().size());
       return;
     }
 
-    ClassSubject clazz = dexInspector.clazz(DependentUser.class);
+    ClassSubject clazz = codeInspector.clazz(DependentUser.class);
     assertThat(clazz, isRenamed());
     // Members of DependentUser are not used anywhere.
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
@@ -105,7 +105,7 @@
     assertThat(f, not(isPresent()));
 
     // Although DependentUser#callFoo is shrinked, Dependent is kept via -if.
-    clazz = dexInspector.clazz(Dependent.class);
+    clazz = codeInspector.clazz(Dependent.class);
     assertThat(clazz, isRenamed());
     // But, its members are gone.
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
@@ -123,17 +123,17 @@
         "-keep,allowobfuscation class <1>.<2>"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
     if (!keepPrecondition) {
       // TODO(b/73708139): Proguard6 kept Dependent (w/o any members), which is not necessary.
       if (shrinker == Shrinker.PROGUARD6) {
         return;
       }
-      assertEquals(1, dexInspector.allClasses().size());
+      assertEquals(1, codeInspector.allClasses().size());
       return;
     }
 
-    ClassSubject clazz = dexInspector.clazz(DependentUser.class);
+    ClassSubject clazz = codeInspector.clazz(DependentUser.class);
     assertThat(clazz, isRenamed());
     // Members of DependentUser are not used anywhere.
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
@@ -142,7 +142,7 @@
     assertThat(f, not(isPresent()));
 
     // Although DependentUser#callFoo is shrinked, Dependent is kept via -if.
-    clazz = dexInspector.clazz(Dependent.class);
+    clazz = codeInspector.clazz(Dependent.class);
     assertThat(clazz, isRenamed());
     // But, its members are gone.
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
@@ -160,13 +160,13 @@
         "}"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
     if (!keepPrecondition) {
-      assertEquals(1, dexInspector.allClasses().size());
+      assertEquals(1, codeInspector.allClasses().size());
       return;
     }
 
-    ClassSubject clazz = dexInspector.clazz(DependentUser.class);
+    ClassSubject clazz = codeInspector.clazz(DependentUser.class);
     assertThat(clazz, isRenamed());
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
     assertThat(m, isRenamed());
@@ -174,7 +174,7 @@
     assertThat(f, not(isPresent()));
 
     // Dependent is kept due to DependentUser#callFoo, but renamed.
-    clazz = dexInspector.clazz(Dependent.class);
+    clazz = codeInspector.clazz(Dependent.class);
     assertThat(clazz, isRenamed());
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
     assertThat(m, isRenamed());
@@ -196,17 +196,17 @@
         "-keep,allowobfuscation class **.*User"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
     if (!keepPrecondition) {
       // TODO(b/73708139): Proguard6 kept DependentUser (w/o any members), which is not necessary.
       if (shrinker == Shrinker.PROGUARD6) {
         return;
       }
-      assertEquals(1, dexInspector.allClasses().size());
+      assertEquals(1, codeInspector.allClasses().size());
       return;
     }
 
-    ClassSubject clazz = dexInspector.clazz(DependentUser.class);
+    ClassSubject clazz = codeInspector.clazz(DependentUser.class);
     assertThat(clazz, isRenamed());
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
     assertThat(m, isRenamed());
@@ -214,7 +214,7 @@
     assertThat(f, not(isPresent()));
 
     // Dependent is kept due to DependentUser#callFoo, but renamed.
-    clazz = dexInspector.clazz(Dependent.class);
+    clazz = codeInspector.clazz(Dependent.class);
     assertThat(clazz, isRenamed());
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
     assertThat(m, isRenamed());
@@ -236,17 +236,17 @@
         "-keep,allowobfuscation class <1>.<2>User"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
     if (!keepPrecondition) {
       // TODO(b/73708139): Proguard6 kept DependentUser (w/o any members), which is not necessary.
       if (shrinker == Shrinker.PROGUARD6) {
         return;
       }
-      assertEquals(1, dexInspector.allClasses().size());
+      assertEquals(1, codeInspector.allClasses().size());
       return;
     }
 
-    ClassSubject clazz = dexInspector.clazz(DependentUser.class);
+    ClassSubject clazz = codeInspector.clazz(DependentUser.class);
     assertThat(clazz, isRenamed());
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
     assertThat(m, isRenamed());
@@ -254,7 +254,7 @@
     assertThat(f, not(isPresent()));
 
     // Dependent is kept due to DependentUser#callFoo, but renamed.
-    clazz = dexInspector.clazz(Dependent.class);
+    clazz = codeInspector.clazz(Dependent.class);
     assertThat(clazz, isRenamed());
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
     assertThat(m, isRenamed());
@@ -274,9 +274,9 @@
         "-keepnames class **.Dependent"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
 
-    ClassSubject clazz = dexInspector.clazz(Dependent.class);
+    ClassSubject clazz = codeInspector.clazz(Dependent.class);
     // Only class name is not renamed, if triggered.
     assertThat(clazz, keepPrecondition ? isNotRenamed() : isRenamed());
     MethodSubject m = clazz.method("java.lang.String", "foo", ImmutableList.of());
@@ -299,9 +299,9 @@
         "}"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
 
-    ClassSubject clazz = dexInspector.clazz(Dependent.class);
+    ClassSubject clazz = codeInspector.clazz(Dependent.class);
     // Class name is not renamed, if triggered.
     assertThat(clazz, keepPrecondition ? isNotRenamed() : isRenamed());
     MethodSubject m = clazz.method("java.lang.String", "foo", ImmutableList.of());
@@ -325,9 +325,9 @@
         "}"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
 
-    ClassSubject clazz = dexInspector.clazz(Dependent.class);
+    ClassSubject clazz = codeInspector.clazz(Dependent.class);
     assertThat(clazz, isRenamed());
     MethodSubject m = clazz.method("java.lang.String", "foo", ImmutableList.of());
     // Only method name is not renamed, if triggered.
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java
index 0292344..d199cd4 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.shaking.ifrule;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -42,13 +42,13 @@
   }
 
   @Override
-  protected DexInspector runR8(
+  protected CodeInspector runR8(
       List<Class> programClasses, String proguardConfig) throws Exception {
     return super.runR8(programClasses, adaptConfiguration(proguardConfig));
   }
 
   @Override
-  protected DexInspector runProguard6(
+  protected CodeInspector runProguard6(
       List<Class> programClasses, String proguardConfig) throws Exception {
     return super.runProguard6(programClasses, adaptConfiguration(proguardConfig));
   }
@@ -77,10 +77,10 @@
         "-keep class **.D"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         R1.class, R2.class, D.class, D2.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         R.class, D1.class);
   }
 
@@ -96,10 +96,10 @@
         "-keep class **.D<2>"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         R1.class, R2.class, D.class, D2.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         R.class, D1.class);
   }
 
@@ -119,10 +119,10 @@
         "-keep class **.D2"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         R.class, D.class, R1.class, D1.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         R2.class, D2.class);
   }
 
@@ -138,10 +138,10 @@
         "-keep class **.D<2>"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         R.class, D.class, R1.class, D1.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         R2.class, D2.class);
   }
 
@@ -158,10 +158,10 @@
         "-keep class **$*D"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         R.class, D.class, R1.class, D1.class, R2.class, D2.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         MainWithInner.InnerR.class, MainWithInner.InnerD.class);
   }
 
@@ -178,10 +178,10 @@
         "-keep class <1>$<2>D"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         R.class, D.class, R1.class, D1.class, R2.class, D2.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         MainWithInner.InnerR.class, MainWithInner.InnerD.class);
   }
 
@@ -202,9 +202,9 @@
             "}",
             "-keep class **.D2");
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector, D2.class);
-    verifyClassesPresent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector, D2.class);
+    verifyClassesPresent(codeInspector,
         I.class, Impl.class, D1.class);
   }
 
@@ -225,9 +225,9 @@
             "}",
             "-keep class <2>.D2");
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector, D2.class);
-    verifyClassesPresent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector, D2.class);
+    verifyClassesPresent(codeInspector,
         I.class, Impl.class, D1.class);
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/inlining/IfRuleWithInlining.java b/src/test/java/com/android/tools/r8/shaking/ifrule/inlining/IfRuleWithInlining.java
index cd2ce6a..7391986 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/inlining/IfRuleWithInlining.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/inlining/IfRuleWithInlining.java
@@ -4,15 +4,15 @@
 
 package com.android.tools.r8.shaking.ifrule.inlining;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
@@ -65,7 +65,7 @@
   }
 
   private void check(AndroidApp app) throws Exception {
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazzA = inspector.clazz(A.class);
     assertThat(clazzA, isPresent());
     // A.a might be inlined.
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
index aed9596..cc574f3 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.shaking.ifrule.verticalclassmerging;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -12,8 +12,8 @@
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
@@ -90,7 +90,7 @@
   }
 
   private void check(AndroidApp app) throws Exception {
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazzA = inspector.clazz(A.class);
     assertEquals(!enableClassMerging, clazzA.isPresent());
     ClassSubject clazzB = inspector.clazz(B.class);
diff --git a/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java b/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java
index c841996..bc94fa6 100644
--- a/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java
@@ -9,7 +9,7 @@
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -18,10 +18,10 @@
 
 public class IncludeDescriptorClassesTest extends TestBase {
   private class Result {
-    final DexInspector inspector;
-    final DexInspector proguardedInspector;
+    final CodeInspector inspector;
+    final CodeInspector proguardedInspector;
 
-    Result(DexInspector inspector, DexInspector proguardedInspector) {
+    Result(CodeInspector inspector, CodeInspector proguardedInspector) {
       this.inspector = inspector;
       this.proguardedInspector = proguardedInspector;
     }
@@ -62,15 +62,15 @@
     List<Class> classes = new ArrayList<>(applicationClasses);
     classes.add(mainClass);
 
-    DexInspector inspector = new DexInspector(compileWithR8(classes, proguardConfig));
+    CodeInspector inspector = new CodeInspector(compileWithR8(classes, proguardConfig));
 
-    DexInspector proguardedInspector = null;
+    CodeInspector proguardedInspector = null;
     // Actually running Proguard should only be during development.
     if (isRunProguard()) {
       Path proguardedJar = temp.newFolder().toPath().resolve("proguarded.jar");
       Path proguardedMap = temp.newFolder().toPath().resolve("proguarded.map");
       ToolHelper.runProguard(jarTestClasses(classes), proguardedJar, proguardConfig, proguardedMap);
-      proguardedInspector = new DexInspector(readJar(proguardedJar), proguardedMap);
+      proguardedInspector = new CodeInspector(readJar(proguardedJar), proguardedMap);
     }
 
     return new Result(inspector, proguardedInspector);
diff --git a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java
index b1ae8bb..97cad3c 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java
@@ -4,24 +4,24 @@
 
 package com.android.tools.r8.shaking.keepclassmembers;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isAbstract;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbstract;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.core.IsNot.not;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
 public class KeepClassMembersTest extends ProguardCompatabilityTestBase {
 
-  private void check(DexInspector inspector, Class mainClass, Class<?> staticClass,
+  private void check(CodeInspector inspector, Class mainClass, Class<?> staticClass,
       boolean forceProguardCompatibility, boolean fromProguard) {
     assertTrue(inspector.clazz(mainClass).isPresent());
     ClassSubject staticClassSubject = inspector.clazz(staticClass);
@@ -70,8 +70,8 @@
         "}",
         "-dontoptimize", "-dontobfuscate"
     ));
-    DexInspector inspector;
-      inspector = new DexInspector(
+    CodeInspector inspector;
+      inspector = new CodeInspector(
           compileWithR8(ImmutableList.of(mainClass, staticClass), proguardConfig,
               options -> options.forceProguardCompatibility = forceProguardCompatibility));
     check(inspector, mainClass, staticClass, forceProguardCompatibility, false);
diff --git a/src/test/java/com/android/tools/r8/shaking/proxy/ProxiesTest.java b/src/test/java/com/android/tools/r8/shaking/proxy/ProxiesTest.java
index 8c71ff7..8d38aee 100644
--- a/src/test/java/com/android/tools/r8/shaking/proxy/ProxiesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/proxy/ProxiesTest.java
@@ -23,14 +23,14 @@
 import com.android.tools.r8.shaking.proxy.testclasses.SubInterface;
 import com.android.tools.r8.shaking.proxy.testclasses.TestClass;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
 
 public class ProxiesTest extends TestBase {
 
-  private void runTest(List<String> additionalKeepRules, Consumer<DexInspector> inspection,
+  private void runTest(List<String> additionalKeepRules, Consumer<CodeInspector> inspection,
       String expectedResult)
       throws Exception {
     Class mainClass = Main.class;
@@ -51,18 +51,18 @@
     builder.addProguardConfiguration(additionalKeepRules, Origin.unknown());
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
     AndroidApp app = ToolHelper.runR8(builder.build(), o -> o.enableDevirtualization = false);
-    inspection.accept(new DexInspector(app));
+    inspection.accept(new CodeInspector(app));
     assertEquals(expectedResult, runOnArt(app, mainClass));
   }
 
-  private int countInstructionInX(DexInspector inspector, Class<? extends Instruction> invoke) {
+  private int countInstructionInX(CodeInspector inspector, Class<? extends Instruction> invoke) {
     MethodSignature signatureForX =
         new MethodSignature("x", "void", ImmutableList.of(BaseInterface.class.getCanonicalName()));
     DexCode x = inspector.clazz(Main.class).method(signatureForX).getMethod().getCode().asDexCode();
     return (int) filterInstructionKind(x, invoke).count();
   }
 
-  private int countInstructionInY(DexInspector inspector, Class<? extends Instruction> invoke) {
+  private int countInstructionInY(CodeInspector inspector, Class<? extends Instruction> invoke) {
     MethodSignature signatureForY =
         new MethodSignature("y", "void", ImmutableList.of(SubInterface.class.getCanonicalName()));
     DexCode y = inspector.clazz(Main.class).method(signatureForY).getMethod().getCode().asDexCode();
@@ -71,7 +71,7 @@
         .count();
   }
 
-  private int countInstructionInZ(DexInspector inspector, Class<? extends Instruction> invoke) {
+  private int countInstructionInZ(CodeInspector inspector, Class<? extends Instruction> invoke) {
     MethodSignature signatureForZ =
         new MethodSignature("z", "void", ImmutableList.of(TestClass.class.getCanonicalName()));
     DexCode z = inspector.clazz(Main.class).method(signatureForZ).getMethod().getCode().asDexCode();
@@ -81,7 +81,7 @@
   }
 
   private int countInstructionInZSubClass(
-      DexInspector inspector, Class<? extends Instruction> invoke) {
+      CodeInspector inspector, Class<? extends Instruction> invoke) {
     MethodSignature signatureForZ =
         new MethodSignature("z", "void", ImmutableList.of(SubClass.class.getCanonicalName()));
     DexCode z = inspector.clazz(Main.class).method(signatureForZ).getMethod().getCode().asDexCode();
@@ -90,7 +90,7 @@
         .count();
   }
 
-  private void noInterfaceKept(DexInspector inspector) {
+  private void noInterfaceKept(CodeInspector inspector) {
     // Indirectly assert that method is inlined into x, y and z.
     assertEquals(1, countInstructionInX(inspector, InvokeInterface.class));
     assertEquals(1, countInstructionInY(inspector, InvokeInterface.class));
@@ -104,7 +104,7 @@
         "TestClass 1\nTestClass 1\nTestClass 1\nProxy\nEXCEPTION\n");
   }
 
-  private void baseInterfaceKept(DexInspector inspector) {
+  private void baseInterfaceKept(CodeInspector inspector) {
     // Indirectly assert that method is not inlined into x.
     assertEquals(3, countInstructionInX(inspector, InvokeInterface.class));
     // Indirectly assert that method is inlined into y and z.
@@ -124,7 +124,7 @@
         "TestClass 2\nTestClass 2\nTestClass 2\nProxy\nEXCEPTION\n");
   }
 
-  private void subInterfaceKept(DexInspector inspector) {
+  private void subInterfaceKept(CodeInspector inspector) {
     // Indirectly assert that method is not inlined into x or y.
     assertEquals(3, countInstructionInX(inspector, InvokeInterface.class));
     assertEquals(3, countInstructionInY(inspector, InvokeInterface.class));
@@ -146,7 +146,7 @@
         "TestClass 4\nTestClass 4\nTestClass 4\nSUCCESS\n");
   }
 
-  private void classKept(DexInspector inspector) {
+  private void classKept(CodeInspector inspector) {
     // Indirectly assert that method is not inlined into x, y or z.
     assertEquals(3, countInstructionInX(inspector, InvokeInterface.class));
     assertEquals(3, countInstructionInY(inspector, InvokeInterface.class));
diff --git a/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java b/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java
index 365d039..147b1b4 100644
--- a/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java
@@ -8,7 +8,7 @@
 
 package com.android.tools.r8.shaking.testrules;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
@@ -17,25 +17,25 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
 
 public class ForceInlineTest extends TestBase {
 
-  private DexInspector runTest(List<String> proguardConfiguration) throws Exception {
+  private CodeInspector runTest(List<String> proguardConfiguration) throws Exception {
     R8Command.Builder builder =
         ToolHelper.prepareR8CommandBuilder(readClasses(Main.class, A.class, B.class, C.class));
     ToolHelper.allowTestProguardOptions(builder);
     builder.addProguardConfiguration(proguardConfiguration, Origin.unknown());
-    return new DexInspector(ToolHelper.runR8(builder.build()));
+    return new CodeInspector(ToolHelper.runR8(builder.build()));
   }
 
   @Test
   public void testDefaultInlining() throws Exception {
-    DexInspector inspector = runTest(ImmutableList.of(
+    CodeInspector inspector = runTest(ImmutableList.of(
         "-keep class **.Main { *; }",
         "-dontobfuscate"
     ));
@@ -61,7 +61,7 @@
 
   @Test
   public void testNeverInline() throws Exception {
-    DexInspector inspector = runTest(ImmutableList.of(
+    CodeInspector inspector = runTest(ImmutableList.of(
         "-neverinline class **.A { method(); }",
         "-neverinline class **.B { method(); }",
         "-keep class **.Main { *; }",
@@ -86,7 +86,7 @@
 
   @Test
   public void testForceInline() throws Exception {
-    DexInspector inspector = runTest(ImmutableList.of(
+    CodeInspector inspector = runTest(ImmutableList.of(
         "-forceinline class **.A { int m(int, int); }",
         "-forceinline class **.B { int m(int, int); }",
         "-keep class **.Main { *; }",
@@ -108,7 +108,7 @@
   @Test
   public void testForceInlineFails() throws Exception {
     try {
-      DexInspector inspector = runTest(ImmutableList.of(
+      CodeInspector inspector = runTest(ImmutableList.of(
           "-forceinline class **.A { int x(); }",
           "-keep class **.Main { *; }",
           "-dontobfuscate"
diff --git a/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java b/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
index 5f9a6fd..ce1fd33 100644
--- a/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
+++ b/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
@@ -20,8 +20,8 @@
 import com.android.tools.r8.ir.code.SingleConstant;
 import com.android.tools.r8.ir.code.WideConstant;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -54,7 +54,7 @@
     public void run() throws Exception {
       AndroidApp processdApplication = processApplication(buildApplication(builder));
       assertEquals(1, getNumberOfProgramClasses(processdApplication));
-      DexInspector inspector = new DexInspector(processdApplication);
+      CodeInspector inspector = new CodeInspector(processdApplication);
       ClassSubject clazz = inspector.clazz(DEFAULT_CLASS_NAME);
       clazz.forAllMethods(method -> {
         int index = Integer.parseInt(method.getMethod().method.name.toString().substring(1));
diff --git a/src/test/java/com/android/tools/r8/smali/OutlineTest.java b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
index 41e894e..1479add 100644
--- a/src/test/java/com/android/tools/r8/smali/OutlineTest.java
+++ b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
@@ -34,9 +34,9 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.InternalOptions.OutlineOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -59,7 +59,7 @@
   }
 
   DexEncodedMethod getInvokedMethod(DexApplication application, InvokeStatic invoke) {
-    DexInspector inspector = new DexInspector(application);
+    CodeInspector inspector = new CodeInspector(application);
     ClassSubject clazz = inspector.clazz(invoke.getMethod().holder.toSourceString());
     assertTrue(clazz.isPresent());
     DexMethod invokedMethod = invoke.getMethod();
@@ -843,7 +843,7 @@
     assertEquals(2, getNumberOfProgramClasses(processedApplication));
 
     // Check that three outlining methods was created.
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     ClassSubject clazz = inspector.clazz(OutlineOptions.CLASS_NAME);
     assertTrue(clazz.isPresent());
     assertEquals(3, clazz.getDexClass().directMethods().length);
diff --git a/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java b/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java
index c8713e3..9c9991e 100644
--- a/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java
+++ b/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java
@@ -12,8 +12,8 @@
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
@@ -80,7 +80,7 @@
             keepMainProguardConfiguration("Test"),
             options -> options.enableInlining = false);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     MethodSubject method = inspector.clazz("Test").method("void", "test", ImmutableList.of());
     DexCode code = method.getMethod().getCode().asDexCode();
     assertTrue(code.isEmptyVoidMethod());
@@ -153,7 +153,7 @@
             keepMainProguardConfiguration("Test"),
             options -> options.enableInlining = false);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     MethodSubject method = inspector.clazz("Test").method("void", "test", ImmutableList.of());
     DexCode code = method.getMethod().getCode().asDexCode();
     assertTrue(code.isEmptyVoidMethod());
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java b/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java
index 7287cc3..8d780b4 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java
@@ -9,8 +9,8 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.EmbeddedOrigin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
 import java.util.concurrent.ExecutionException;
 import org.junit.Test;
@@ -19,7 +19,7 @@
 
   private void checkJavaLangString(AndroidApp application, boolean present) {
     try {
-      DexInspector inspector = new DexInspector(application);
+      CodeInspector inspector = new CodeInspector(application);
       ClassSubject clazz = inspector.clazz("java.lang.String");
       assertEquals(present, clazz.isPresent());
     } catch (IOException | ExecutionException e) {
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
index 7aabadb..b12c0b9 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
@@ -25,8 +25,8 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.Collection;
@@ -112,7 +112,7 @@
   }
 
   protected DexClass getClass(DexApplication application, String className) {
-    DexInspector inspector = new DexInspector(application);
+    CodeInspector inspector = new CodeInspector(application);
     ClassSubject clazz = inspector.clazz(className);
     assertTrue(clazz.isPresent());
     return clazz.getDexClass();
@@ -124,7 +124,7 @@
 
   protected DexClass getClass(Path appPath, String className) {
     try {
-      DexInspector inspector = new DexInspector(appPath);
+      CodeInspector inspector = new CodeInspector(appPath);
       ClassSubject clazz = inspector.clazz(className);
       assertTrue(clazz.isPresent());
       return clazz.getDexClass();
@@ -135,14 +135,14 @@
 
   protected DexEncodedMethod getMethod(Path appPath, MethodSignature signature) {
     try {
-      DexInspector inspector = new DexInspector(appPath);
+      CodeInspector inspector = new CodeInspector(appPath);
       return getMethod(inspector, signature);
     } catch (IOException | ExecutionException e) {
       throw new RuntimeException(e);
     }
   }
 
-  protected DexEncodedMethod getMethod(DexInspector inspector, MethodSignature signature) {
+  protected DexEncodedMethod getMethod(CodeInspector inspector, MethodSignature signature) {
     return getMethod(
         inspector, signature.clazz, signature.returnType, signature.name, signature.parameterTypes);
   }
diff --git a/src/test/java/com/android/tools/r8/utils/ArtErrorParser.java b/src/test/java/com/android/tools/r8/utils/ArtErrorParser.java
index 51c6ca5..5f00fc9 100644
--- a/src/test/java/com/android/tools/r8/utils/ArtErrorParser.java
+++ b/src/test/java/com/android/tools/r8/utils/ArtErrorParser.java
@@ -4,9 +4,9 @@
 package com.android.tools.r8.utils;
 
 import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -72,7 +72,7 @@
   public static abstract class ArtErrorInfo {
     public abstract int consumedLines();
     public abstract String getMessage();
-    public abstract String dump(DexInspector inspector, boolean markLocation);
+    public abstract String dump(CodeInspector inspector, boolean markLocation);
   }
 
   private static class ArtMethodError extends ArtErrorInfo {
@@ -117,7 +117,7 @@
     }
 
     @Override
-    public String dump(DexInspector inspector, boolean markLocation) {
+    public String dump(CodeInspector inspector, boolean markLocation) {
       ClassSubject clazz = inspector.clazz(className);
       MethodSubject method = clazz.method(methodReturn, methodName, methodFormals);
       DexEncodedMethod dex = method.getMethod();
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentAnnotationSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentAnnotationSubject.java
similarity index 91%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/AbsentAnnotationSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/AbsentAnnotationSubject.java
index e6d9306..a82d9b0 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentAnnotationSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentAnnotationSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedAnnotation;
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
similarity index 97%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/AbsentClassSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
index e2fa906..167bc8d 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexClass;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentFieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
similarity index 96%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/AbsentFieldSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
index f79fc00..d4409d1 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentFieldSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexValue;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
similarity index 96%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/AbsentMethodSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
index 5f10dd7..1396be9 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.naming.MemberNaming.Signature;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AnnotationSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationSubject.java
similarity index 88%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/AnnotationSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationSubject.java
index 24682be..4bffcca 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/AnnotationSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedAnnotation;
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/CfInstructionIterator.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionIterator.java
similarity index 73%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/CfInstructionIterator.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionIterator.java
index d000250..0a3263a 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/CfInstructionIterator.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionIterator.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.graph.Code;
@@ -10,11 +10,11 @@
 
 class CfInstructionIterator implements InstructionIterator {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
   private final Iterator<CfInstruction> iterator;
 
-  CfInstructionIterator(DexInspector dexInspector, MethodSubject method) {
-    this.dexInspector = dexInspector;
+  CfInstructionIterator(CodeInspector codeInspector, MethodSubject method) {
+    this.codeInspector = codeInspector;
     assert method.isPresent();
     Code code = method.getMethod().getCode();
     assert code != null && code.isCfCode();
@@ -28,6 +28,6 @@
 
   @Override
   public InstructionSubject next() {
-    return dexInspector.createInstructionSubject(iterator.next());
+    return codeInspector.createInstructionSubject(iterator.next());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/CfInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
similarity index 78%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/CfInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
index ae900f3..fa00432 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/CfInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
+import com.android.tools.r8.cf.code.CfConstNull;
 import com.android.tools.r8.cf.code.CfConstString;
 import com.android.tools.r8.cf.code.CfFieldInstruction;
 import com.android.tools.r8.cf.code.CfGoto;
@@ -16,6 +17,7 @@
 import com.android.tools.r8.cf.code.CfNop;
 import com.android.tools.r8.cf.code.CfPosition;
 import com.android.tools.r8.cf.code.CfReturnVoid;
+import com.android.tools.r8.cf.code.CfStackInstruction;
 import com.android.tools.r8.cf.code.CfThrow;
 import org.objectweb.asm.Opcodes;
 
@@ -55,13 +57,14 @@
   }
 
   @Override
-  public boolean isConstString() {
+  public boolean isConstString(JumboStringMode jumboStringMode) {
     return instruction instanceof CfConstString;
   }
 
   @Override
-  public boolean isConstString(String value) {
-    return isConstString() && ((CfConstString) instruction).getString().toString().equals(value);
+  public boolean isConstString(String value, JumboStringMode jumboStringMode) {
+    return isConstString(jumboStringMode)
+        && ((CfConstString) instruction).getString().toSourceString().equals(value);
   }
 
   @Override
@@ -115,4 +118,17 @@
   public boolean isPosition() {
     return instruction instanceof CfPosition;
   }
+
+  public boolean isStackInstruction(CfStackInstruction.Opcode opcode) {
+    return instruction instanceof CfStackInstruction
+        && ((CfStackInstruction) instruction).getOpcode() == opcode;
+  }
+
+  public boolean isConstNull() {
+    return instruction instanceof CfConstNull;
+  }
+
+  public boolean isIfNull() {
+    return instruction instanceof CfIf && ((CfIf) instruction).getOpcode() == Opcodes.IFNULL;
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/ClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
similarity index 97%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/ClassSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
index afb4928..bbb6213 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/ClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInspector.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
similarity index 90%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/DexInspector.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index c67a560..ecc78c6 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -1,7 +1,7 @@
 // Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import static org.junit.Assert.assertTrue;
 
@@ -30,6 +30,7 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject.JumboStringMode;
 import com.google.common.collect.BiMap;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
@@ -44,7 +45,7 @@
 import java.util.function.Consumer;
 import java.util.function.Function;
 
-public class DexInspector {
+public class CodeInspector {
 
   private final DexApplication application;
   final DexItemFactory dexItemFactory;
@@ -54,19 +55,19 @@
   public static MethodSignature MAIN =
       new MethodSignature("main", "void", new String[] {"java.lang.String[]"});
 
-  public DexInspector(Path file, String mappingFile) throws IOException, ExecutionException {
+  public CodeInspector(Path file, String mappingFile) throws IOException, ExecutionException {
     this(Collections.singletonList(file), mappingFile);
   }
 
-  public DexInspector(Path file) throws IOException, ExecutionException {
+  public CodeInspector(Path file) throws IOException, ExecutionException {
     this(Collections.singletonList(file), null);
   }
 
-  public DexInspector(List<Path> files) throws IOException, ExecutionException {
+  public CodeInspector(List<Path> files) throws IOException, ExecutionException {
     this(files, null);
   }
 
-  public DexInspector(List<Path> files, String mappingFile) throws IOException, ExecutionException {
+  public CodeInspector(List<Path> files, String mappingFile) throws IOException, ExecutionException {
     if (mappingFile != null) {
       this.mapping = ClassNameMapper.mapperFromFile(Paths.get(mappingFile));
       originalToObfuscatedMapping = this.mapping.getObfuscatedToOriginalMapping().inverse();
@@ -74,23 +75,23 @@
       this.mapping = null;
       originalToObfuscatedMapping = null;
     }
-    Timing timing = new Timing("DexInspector");
+    Timing timing = new Timing("CodeInspector");
     InternalOptions options = new InternalOptions();
     dexItemFactory = options.itemFactory;
     AndroidApp input = AndroidApp.builder().addProgramFiles(files).build();
     application = new ApplicationReader(input, options, timing).read();
   }
 
-  public DexInspector(AndroidApp app) throws IOException, ExecutionException {
+  public CodeInspector(AndroidApp app) throws IOException, ExecutionException {
     this(
-        new ApplicationReader(app, new InternalOptions(), new Timing("DexInspector"))
+        new ApplicationReader(app, new InternalOptions(), new Timing("CodeInspector"))
             .read(app.getProguardMapOutputData()));
   }
 
-  public DexInspector(AndroidApp app, Consumer<InternalOptions> optionsConsumer)
+  public CodeInspector(AndroidApp app, Consumer<InternalOptions> optionsConsumer)
       throws IOException, ExecutionException {
     this(
-        new ApplicationReader(app, runOptionsConsumer(optionsConsumer), new Timing("DexInspector"))
+        new ApplicationReader(app, runOptionsConsumer(optionsConsumer), new Timing("CodeInspector"))
             .read(app.getProguardMapOutputData()));
   }
 
@@ -100,13 +101,13 @@
     return internalOptions;
   }
 
-  public DexInspector(AndroidApp app, Path proguardMap) throws IOException, ExecutionException {
+  public CodeInspector(AndroidApp app, Path proguardMap) throws IOException, ExecutionException {
     this(
-        new ApplicationReader(app, new InternalOptions(), new Timing("DexInspector"))
+        new ApplicationReader(app, new InternalOptions(), new Timing("CodeInspector"))
             .read(StringResource.fromFile(proguardMap)));
   }
 
-  public DexInspector(DexApplication application) {
+  public CodeInspector(DexApplication application) {
     dexItemFactory = application.dexItemFactory;
     this.application = application;
     this.mapping = application.getProguardMap();
@@ -254,6 +255,8 @@
       return new FieldAccessDexInstructionSubject(this, instruction);
     } else if (dexInst.isNewInstance()) {
       return new NewInstanceDexInstructionSubject(instruction);
+    } else if (dexInst.isConstString(JumboStringMode.ALLOW)) {
+      return new ConstStringDexInstructionSubject(instruction);
     } else {
       return dexInst;
     }
@@ -267,6 +270,8 @@
       return new FieldAccessCfInstructionSubject(this, instruction);
     } else if (cfInst.isNewInstance()) {
       return new NewInstanceCfInstructionSubject(instruction);
+    } else if (cfInst.isConstString(JumboStringMode.ALLOW)) {
+      return new ConstStringCfInstructionSubject(instruction);
     } else {
       return cfInst;
     }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringCfInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringCfInstructionSubject.java
new file mode 100644
index 0000000..da545e4
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringCfInstructionSubject.java
@@ -0,0 +1,22 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.utils.codeinspector;
+
+import com.android.tools.r8.cf.code.CfConstString;
+import com.android.tools.r8.cf.code.CfInstruction;
+import com.android.tools.r8.graph.DexString;
+
+public class ConstStringCfInstructionSubject extends CfInstructionSubject
+    implements ConstStringInstructionSubject {
+  public ConstStringCfInstructionSubject(CfInstruction instruction) {
+    super(instruction);
+    assert isConstString(JumboStringMode.ALLOW);
+  }
+
+  @Override
+  public DexString getString() {
+    return ((CfConstString) instruction).getString();
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java
new file mode 100644
index 0000000..cb69144
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java
@@ -0,0 +1,28 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.utils.codeinspector;
+
+import com.android.tools.r8.code.ConstString;
+import com.android.tools.r8.code.ConstStringJumbo;
+import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.graph.DexString;
+
+public class ConstStringDexInstructionSubject extends DexInstructionSubject
+    implements ConstStringInstructionSubject {
+  public ConstStringDexInstructionSubject(Instruction instruction) {
+    super(instruction);
+    assert isConstString(JumboStringMode.ALLOW);
+  }
+
+  @Override
+  public DexString getString() {
+    if (instruction instanceof ConstString) {
+      return ((ConstString) instruction).getString();
+    } else {
+      assert (instruction instanceof ConstStringJumbo);
+      return ((ConstStringJumbo) instruction).getString();
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringInstructionSubject.java
new file mode 100644
index 0000000..5914be7
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringInstructionSubject.java
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.utils.codeinspector;
+
+import com.android.tools.r8.graph.DexString;
+
+public interface ConstStringInstructionSubject extends InstructionSubject {
+  DexString getString();
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionIterator.java b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java
similarity index 74%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionIterator.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java
index 9ed4de1..8ae5609 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionIterator.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexCode;
@@ -10,12 +10,12 @@
 
 class DexInstructionIterator implements InstructionIterator {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
   private final DexCode code;
   private int index;
 
-  DexInstructionIterator(DexInspector dexInspector, MethodSubject method) {
-    this.dexInspector = dexInspector;
+  DexInstructionIterator(CodeInspector codeInspector, MethodSubject method) {
+    this.codeInspector = codeInspector;
     assert method.isPresent();
     Code code = method.getMethod().getCode();
     assert code != null && code.isDexCode();
@@ -33,6 +33,6 @@
     if (index == code.instructions.length) {
       throw new NoSuchElementException();
     }
-    return dexInspector.createInstructionSubject(code.instructions[index++]);
+    return codeInspector.createInstructionSubject(code.instructions[index++]);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
similarity index 89%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
index 82d725a..9c6d21c 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
@@ -2,10 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.code.Const4;
 import com.android.tools.r8.code.ConstString;
+import com.android.tools.r8.code.ConstStringJumbo;
 import com.android.tools.r8.code.Goto;
 import com.android.tools.r8.code.IfEqz;
 import com.android.tools.r8.code.IfNez;
@@ -86,14 +87,18 @@
   }
 
   @Override
-  public boolean isConstString() {
-    return instruction instanceof ConstString;
+  public boolean isConstString(JumboStringMode jumboStringMode) {
+    return instruction instanceof ConstString
+        || (jumboStringMode == JumboStringMode.ALLOW && instruction instanceof ConstStringJumbo);
   }
 
   @Override
-  public boolean isConstString(String value) {
-    return instruction instanceof ConstString
-        && ((ConstString) instruction).BBBB.toSourceString().equals(value);
+  public boolean isConstString(String value, JumboStringMode jumboStringMode) {
+    return (instruction instanceof ConstString
+            && ((ConstString) instruction).BBBB.toSourceString().equals(value))
+        || (jumboStringMode == JumboStringMode.ALLOW
+            && instruction instanceof ConstStringJumbo
+            && ((ConstStringJumbo) instruction).BBBBBBBB.toSourceString().equals(value));
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessCfInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessCfInstructionSubject.java
similarity index 60%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessCfInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessCfInstructionSubject.java
index a2103e6..e9ccfd3 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessCfInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessCfInstructionSubject.java
@@ -2,22 +2,23 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.cf.code.CfFieldInstruction;
 import com.android.tools.r8.cf.code.CfInstruction;
 
 public class FieldAccessCfInstructionSubject extends CfInstructionSubject
     implements FieldAccessInstructionSubject {
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
 
-  public FieldAccessCfInstructionSubject(DexInspector dexInspector, CfInstruction instruction) {
+  public FieldAccessCfInstructionSubject(CodeInspector codeInspector, CfInstruction instruction) {
     super(instruction);
-    this.dexInspector = dexInspector;
+    this.codeInspector = codeInspector;
     assert isFieldAccess();
   }
 
+  @Override
   public TypeSubject holder() {
-    return new TypeSubject(dexInspector, ((CfFieldInstruction) instruction).getField().getHolder());
+    return new TypeSubject(codeInspector, ((CfFieldInstruction) instruction).getField().getHolder());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java
new file mode 100644
index 0000000..b9e7fd2
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.utils.codeinspector;
+
+import com.android.tools.r8.code.Instruction;
+
+public class FieldAccessDexInstructionSubject extends DexInstructionSubject
+    implements FieldAccessInstructionSubject {
+
+  private final CodeInspector codeInspector;
+
+  public FieldAccessDexInstructionSubject(CodeInspector codeInspector, Instruction instruction) {
+    super(instruction);
+    this.codeInspector = codeInspector;
+    assert isFieldAccess();
+  }
+
+  @Override
+  public TypeSubject holder() {
+    return new TypeSubject(codeInspector, instruction.getField().getHolder());
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessInstructionSubject.java
similarity index 86%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessInstructionSubject.java
index 54b27c7..355f3a4 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessInstructionSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 public interface FieldAccessInstructionSubject extends InstructionSubject {
   TypeSubject holder();
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java
similarity index 92%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FieldSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java
index 1e9471b..f9a669a 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexValue;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FilteredInstructionIterator.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FilteredInstructionIterator.java
similarity index 85%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FilteredInstructionIterator.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FilteredInstructionIterator.java
index 5f3c078..870953e 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FilteredInstructionIterator.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FilteredInstructionIterator.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import java.util.Iterator;
 import java.util.NoSuchElementException;
@@ -15,8 +15,8 @@
   private InstructionSubject pendingNext = null;
 
   FilteredInstructionIterator(
-      DexInspector dexInspector, MethodSubject method, Predicate<InstructionSubject> predicate) {
-    this.iterator = dexInspector.createInstructionIterator(method);
+      CodeInspector codeInspector, MethodSubject method, Predicate<InstructionSubject> predicate) {
+    this.iterator = codeInspector.createInstructionIterator(method);
     this.predicate = predicate;
     hasNext();
   }
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundAnnotationSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundAnnotationSubject.java
similarity index 93%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FoundAnnotationSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FoundAnnotationSubject.java
index ed85b24..546ef59 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundAnnotationSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundAnnotationSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexEncodedAnnotation;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
similarity index 79%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FoundClassSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
index 2202f89..9a0661f 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexClass;
@@ -25,12 +25,12 @@
 
 public class FoundClassSubject extends ClassSubject {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
   private final DexClass dexClass;
   final ClassNamingForNameMapper naming;
 
-  FoundClassSubject(DexInspector dexInspector, DexClass dexClass, ClassNamingForNameMapper naming) {
-    this.dexInspector = dexInspector;
+  FoundClassSubject(CodeInspector codeInspector, DexClass dexClass, ClassNamingForNameMapper naming) {
+    this.codeInspector = codeInspector;
     this.dexClass = dexClass;
     this.naming = naming;
   }
@@ -42,14 +42,14 @@
 
   @Override
   public void forAllMethods(Consumer<FoundMethodSubject> inspection) {
-    DexInspector.forAll(
+    CodeInspector.forAll(
         dexClass.directMethods(),
-        (encoded, clazz) -> new FoundMethodSubject(dexInspector, encoded, clazz),
+        (encoded, clazz) -> new FoundMethodSubject(codeInspector, encoded, clazz),
         this,
         inspection);
-    DexInspector.forAll(
+    CodeInspector.forAll(
         dexClass.virtualMethods(),
-        (encoded, clazz) -> new FoundMethodSubject(dexInspector, encoded, clazz),
+        (encoded, clazz) -> new FoundMethodSubject(codeInspector, encoded, clazz),
         this,
         inspection);
   }
@@ -59,11 +59,11 @@
     DexType[] parameterTypes = new DexType[parameters.size()];
     for (int i = 0; i < parameters.size(); i++) {
       parameterTypes[i] =
-          dexInspector.toDexType(dexInspector.getObfuscatedTypeName(parameters.get(i)));
+          codeInspector.toDexType(codeInspector.getObfuscatedTypeName(parameters.get(i)));
     }
     DexProto proto =
-        dexInspector.dexItemFactory.createProto(
-            dexInspector.toDexType(dexInspector.getObfuscatedTypeName(returnType)), parameterTypes);
+        codeInspector.dexItemFactory.createProto(
+            codeInspector.toDexType(codeInspector.getObfuscatedTypeName(returnType)), parameterTypes);
     if (naming != null) {
       String[] parameterStrings = new String[parameterTypes.length];
       Signature signature =
@@ -74,15 +74,15 @@
       }
     }
     DexMethod dexMethod =
-        dexInspector.dexItemFactory.createMethod(
-            dexClass.type, proto, dexInspector.dexItemFactory.createString(name));
+        codeInspector.dexItemFactory.createMethod(
+            dexClass.type, proto, codeInspector.dexItemFactory.createString(name));
     DexEncodedMethod encoded = findMethod(dexClass.directMethods(), dexMethod);
     if (encoded == null) {
       encoded = findMethod(dexClass.virtualMethods(), dexMethod);
     }
     return encoded == null
         ? new AbsentMethodSubject()
-        : new FoundMethodSubject(dexInspector, encoded, this);
+        : new FoundMethodSubject(codeInspector, encoded, this);
   }
 
   private DexEncodedMethod findMethod(DexEncodedMethod[] methods, DexMethod dexMethod) {
@@ -96,21 +96,21 @@
 
   @Override
   public void forAllFields(Consumer<FoundFieldSubject> inspection) {
-    DexInspector.forAll(
+    CodeInspector.forAll(
         dexClass.staticFields(),
-        (dexField, clazz) -> new FoundFieldSubject(dexInspector, dexField, clazz),
+        (dexField, clazz) -> new FoundFieldSubject(codeInspector, dexField, clazz),
         this,
         inspection);
-    DexInspector.forAll(
+    CodeInspector.forAll(
         dexClass.instanceFields(),
-        (dexField, clazz) -> new FoundFieldSubject(dexInspector, dexField, clazz),
+        (dexField, clazz) -> new FoundFieldSubject(codeInspector, dexField, clazz),
         this,
         inspection);
   }
 
   @Override
   public FieldSubject field(String type, String name) {
-    String obfuscatedType = dexInspector.getObfuscatedTypeName(type);
+    String obfuscatedType = codeInspector.getObfuscatedTypeName(type);
     MemberNaming fieldNaming = null;
     if (naming != null) {
       fieldNaming = naming.lookupByOriginalSignature(new FieldSignature(name, type));
@@ -118,17 +118,17 @@
     String obfuscatedName = fieldNaming == null ? name : fieldNaming.getRenamedName();
 
     DexField field =
-        dexInspector.dexItemFactory.createField(
+        codeInspector.dexItemFactory.createField(
             dexClass.type,
-            dexInspector.toDexType(obfuscatedType),
-            dexInspector.dexItemFactory.createString(obfuscatedName));
+            codeInspector.toDexType(obfuscatedType),
+            codeInspector.dexItemFactory.createString(obfuscatedName));
     DexEncodedField encoded = findField(dexClass.staticFields(), field);
     if (encoded == null) {
       encoded = findField(dexClass.instanceFields(), field);
     }
     return encoded == null
         ? new AbsentFieldSubject()
-        : new FoundFieldSubject(dexInspector, encoded, this);
+        : new FoundFieldSubject(codeInspector, encoded, this);
   }
 
   @Override
@@ -161,7 +161,7 @@
     assert !name.endsWith("EnclosingClass")
         && !name.endsWith("EnclosingMethod")
         && !name.endsWith("InnerClass");
-    DexAnnotation annotation = dexInspector.findAnnotation(name, dexClass.annotations);
+    DexAnnotation annotation = codeInspector.findAnnotation(name, dexClass.annotations);
     return annotation == null
         ? new AbsentAnnotationSubject()
         : new FoundAnnotationSubject(annotation);
@@ -237,13 +237,13 @@
 
   @Override
   public String getOriginalSignatureAttribute() {
-    return dexInspector.getOriginalSignatureAttribute(
+    return codeInspector.getOriginalSignatureAttribute(
         dexClass.annotations, GenericSignatureParser::parseClassSignature);
   }
 
   @Override
   public String getFinalSignatureAttribute() {
-    return dexInspector.getFinalSignatureAttribute(dexClass.annotations);
+    return codeInspector.getFinalSignatureAttribute(dexClass.annotations);
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundFieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
similarity index 84%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FoundFieldSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
index 5dfa4f1..ae42b14 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundFieldSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexValue;
@@ -12,13 +12,13 @@
 
 public class FoundFieldSubject extends FieldSubject {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
   private final FoundClassSubject clazz;
   private final DexEncodedField dexField;
 
   public FoundFieldSubject(
-      DexInspector dexInspector, DexEncodedField dexField, FoundClassSubject clazz) {
-    this.dexInspector = dexInspector;
+      CodeInspector codeInspector, DexEncodedField dexField, FoundClassSubject clazz) {
+    this.codeInspector = codeInspector;
     this.clazz = clazz;
     this.dexField = dexField;
   }
@@ -49,7 +49,7 @@
   }
 
   public TypeSubject type() {
-    return new TypeSubject(dexInspector, dexField.field.type);
+    return new TypeSubject(codeInspector, dexField.field.type);
   }
 
   @Override
@@ -67,7 +67,7 @@
     //
     // whereas the final signature is for X.a is "a a"
     String obfuscatedType = signature.type;
-    String originalType = dexInspector.originalToObfuscatedMapping.inverse().get(obfuscatedType);
+    String originalType = codeInspector.originalToObfuscatedMapping.inverse().get(obfuscatedType);
     String fieldType = originalType != null ? originalType : obfuscatedType;
 
     FieldSignature lookupSignature = new FieldSignature(signature.name, fieldType);
@@ -98,13 +98,13 @@
 
   @Override
   public String getOriginalSignatureAttribute() {
-    return dexInspector.getOriginalSignatureAttribute(
+    return codeInspector.getOriginalSignatureAttribute(
         dexField.annotations, GenericSignatureParser::parseFieldSignature);
   }
 
   @Override
   public String getFinalSignatureAttribute() {
-    return dexInspector.getFinalSignatureAttribute(dexField.annotations);
+    return codeInspector.getFinalSignatureAttribute(dexField.annotations);
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
similarity index 83%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FoundMethodSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
index 6eb3858..3fe8186 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.naming.MemberNaming;
@@ -13,13 +13,13 @@
 
 public class FoundMethodSubject extends MethodSubject {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
   private final FoundClassSubject clazz;
   private final DexEncodedMethod dexMethod;
 
   public FoundMethodSubject(
-      DexInspector dexInspector, DexEncodedMethod encoded, FoundClassSubject clazz) {
-    this.dexInspector = dexInspector;
+      CodeInspector codeInspector, DexEncodedMethod encoded, FoundClassSubject clazz) {
+    this.codeInspector = codeInspector;
     this.clazz = clazz;
     this.dexMethod = encoded;
   }
@@ -91,12 +91,12 @@
     String[] OriginalParameters = new String[signature.parameters.length];
     for (int i = 0; i < OriginalParameters.length; i++) {
       String obfuscated = signature.parameters[i];
-      String original = dexInspector.originalToObfuscatedMapping.inverse().get(obfuscated);
+      String original = codeInspector.originalToObfuscatedMapping.inverse().get(obfuscated);
       OriginalParameters[i] = original != null ? original : obfuscated;
     }
     String obfuscatedReturnType = signature.type;
     String originalReturnType =
-        dexInspector.originalToObfuscatedMapping.inverse().get(obfuscatedReturnType);
+        codeInspector.originalToObfuscatedMapping.inverse().get(obfuscatedReturnType);
     String returnType = originalReturnType != null ? originalReturnType : obfuscatedReturnType;
 
     MethodSignature lookupSignature =
@@ -113,24 +113,24 @@
 
   @Override
   public String getOriginalSignatureAttribute() {
-    return dexInspector.getOriginalSignatureAttribute(
+    return codeInspector.getOriginalSignatureAttribute(
         dexMethod.annotations, GenericSignatureParser::parseMethodSignature);
   }
 
   @Override
   public String getFinalSignatureAttribute() {
-    return dexInspector.getFinalSignatureAttribute(dexMethod.annotations);
+    return codeInspector.getFinalSignatureAttribute(dexMethod.annotations);
   }
 
   @Override
   public Iterator<InstructionSubject> iterateInstructions() {
-    return dexInspector.createInstructionIterator(this);
+    return codeInspector.createInstructionIterator(this);
   }
 
   @Override
   public <T extends InstructionSubject> Iterator<T> iterateInstructions(
       Predicate<InstructionSubject> filter) {
-    return new FilteredInstructionIterator<>(dexInspector, this, filter);
+    return new FilteredInstructionIterator<>(codeInspector, this, filter);
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionIterator.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionIterator.java
similarity index 86%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/InstructionIterator.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/InstructionIterator.java
index a777319..4685730 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionIterator.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionIterator.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import java.util.Iterator;
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
similarity index 70%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/InstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
index b6f1e52..6c1f4be 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
@@ -2,9 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 public interface InstructionSubject {
+
+  enum JumboStringMode {
+    ALLOW,
+    DISALLOW
+  };
+
   boolean isFieldAccess();
 
   boolean isInvokeVirtual();
@@ -15,9 +21,9 @@
 
   boolean isNop();
 
-  boolean isConstString();
+  boolean isConstString(JumboStringMode jumboStringMode);
 
-  boolean isConstString(String value);
+  boolean isConstString(String value, JumboStringMode jumboStringMode);
 
   boolean isGoto();
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeCfInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeCfInstructionSubject.java
similarity index 72%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/InvokeCfInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/InvokeCfInstructionSubject.java
index 4d245b2..b307112 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeCfInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeCfInstructionSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfInvoke;
@@ -11,18 +11,20 @@
 
 public class InvokeCfInstructionSubject extends CfInstructionSubject
     implements InvokeInstructionSubject {
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
 
-  public InvokeCfInstructionSubject(DexInspector dexInspector, CfInstruction instruction) {
+  public InvokeCfInstructionSubject(CodeInspector codeInspector, CfInstruction instruction) {
     super(instruction);
     assert isInvoke();
-    this.dexInspector = dexInspector;
+    this.codeInspector = codeInspector;
   }
 
+  @Override
   public TypeSubject holder() {
-    return new TypeSubject(dexInspector, invokedMethod().getHolder());
+    return new TypeSubject(codeInspector, invokedMethod().getHolder());
   }
 
+  @Override
   public DexMethod invokedMethod() {
     if (isInvokeDynamic()) {
       throw new Unimplemented(
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java
similarity index 64%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/InvokeDexInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java
index 51d0767..7b5d41c 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeDexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.graph.DexMethod;
@@ -10,18 +10,20 @@
 public class InvokeDexInstructionSubject extends DexInstructionSubject
     implements InvokeInstructionSubject {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
 
-  public InvokeDexInstructionSubject(DexInspector dexInspector, Instruction instruction) {
+  public InvokeDexInstructionSubject(CodeInspector codeInspector, Instruction instruction) {
     super(instruction);
-    this.dexInspector = dexInspector;
+    this.codeInspector = codeInspector;
     assert isInvoke();
   }
 
+  @Override
   public TypeSubject holder() {
-    return new TypeSubject(dexInspector, invokedMethod().getHolder());
+    return new TypeSubject(codeInspector, invokedMethod().getHolder());
   }
 
+  @Override
   public DexMethod invokedMethod() {
     return instruction.getMethod();
   }
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeInstructionSubject.java
similarity index 88%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/InvokeInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/InvokeInstructionSubject.java
index 9b59340..b2f99dc 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeInstructionSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexMethod;
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/Matchers.java b/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
similarity index 98%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/Matchers.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
index ab3ef13..3b718a4 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/Matchers.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.google.common.collect.ImmutableList;
 import org.hamcrest.Description;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/MemberSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java
similarity index 94%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/MemberSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java
index 1852659..9e90fde 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/MemberSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.naming.MemberNaming.Signature;
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/MethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
similarity index 94%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/MethodSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
index 3427924..6eaaf5f 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/MethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedMethod;
 import java.util.Iterator;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceCfInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceCfInstructionSubject.java
similarity index 92%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceCfInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceCfInstructionSubject.java
index 598ecf2..d3b0a93 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceCfInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceCfInstructionSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfNew;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java
similarity index 92%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceDexInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java
index 5a1b01c..a396468 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceDexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.code.NewInstance;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceInstructionSubject.java
similarity index 87%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceInstructionSubject.java
index 7450fbe..2a0f192 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceInstructionSubject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexType;
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/Subject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/Subject.java
similarity index 86%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/Subject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/Subject.java
index f83eb14..d93e19a 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/Subject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/Subject.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 public abstract class Subject {
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/TypeSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
similarity index 70%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/TypeSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
index 5b21c41..ba2230a 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/TypeSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
@@ -2,17 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.utils.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexType;
 
 public class TypeSubject extends Subject {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
   private final DexType dexType;
 
-  TypeSubject(DexInspector dexInspector, DexType dexType) {
-    this.dexInspector = dexInspector;
+  TypeSubject(CodeInspector codeInspector, DexType dexType) {
+    this.codeInspector = codeInspector;
     this.dexType = dexType;
   }
 
@@ -27,7 +27,7 @@
   }
 
   public boolean is(String type) {
-    return dexType.equals(dexInspector.toDexType(type));
+    return dexType.equals(codeInspector.toDexType(type));
   }
 
   public String toString() {
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessDexInstructionSubject.java
deleted file mode 100644
index ed54f90..0000000
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessDexInstructionSubject.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.utils.dexinspector;
-
-import com.android.tools.r8.code.Instruction;
-
-public class FieldAccessDexInstructionSubject extends DexInstructionSubject
-    implements FieldAccessInstructionSubject {
-
-  private final DexInspector dexInspector;
-
-  public FieldAccessDexInstructionSubject(DexInspector dexInspector, Instruction instruction) {
-    super(instruction);
-    this.dexInspector = dexInspector;
-    assert isFieldAccess();
-  }
-
-  public TypeSubject holder() {
-    return new TypeSubject(dexInspector, instruction.getField().getHolder());
-  }
-}
