diff --git a/src/main/java/com/android/tools/r8/graph/DexItemBasedString.java b/src/main/java/com/android/tools/r8/graph/DexItemBasedString.java
index 7777147..14fc568 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemBasedString.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemBasedString.java
@@ -42,7 +42,8 @@
   @Override
   public void collectIndexedItems(IndexedItemCollection indexedItems) {
     // This instance should not exist when collecting indexed items.
-    // {@link IdentifierMinifier} will replace this with an appropriate {@link DexString}.
+    // {@link com.android.tools.r8.naming.IdentifierMinifier} will replace this with an appropriate
+    // {@link DexString}.
     throw new Unreachable("Remaining DexItemBasedString: " + this.toString());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index b466315..8547206 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -113,7 +113,7 @@
       this.lensCodeRewriter = new LensCodeRewriter(graphLense, appInfo.withSubtyping());
       if (appInfo.hasLiveness()) {
         this.protoLiteRewriter = new ProtoLitePruner(appInfo.withLiveness());
-        if (!appInfo.withLiveness().identifierNameStrings.isEmpty()) {
+        if (!appInfo.withLiveness().identifierNameStrings.isEmpty() && !options.skipMinification) {
           this.identifierNameStringMarker = new IdentifierNameStringMarker(appInfo.withLiveness());
         } else {
           this.identifierNameStringMarker = null;
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 168b794..f6e1ef0 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
@@ -5,36 +5,33 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.code.ConstString;
 import com.android.tools.r8.code.InvokeStatic;
 import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.graph.DexCode;
-import com.android.tools.r8.graph.DexEncodedMethod;
 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;
+import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
-import java.io.IOException;
 import java.nio.file.Path;
 import java.util.List;
-import java.util.concurrent.ExecutionException;
-import org.antlr.runtime.RecognitionException;
 import org.junit.Test;
 
 public class ForNameTest extends SmaliTestBase {
 
+  private final String CLASS_NAME = "Example";
   private final static String BOO = "Boo";
 
   @Test
   public void forName_renamed() throws Exception {
-    SmaliBuilder builder = new SmaliBuilder("Example");
-    MethodSignature main = builder.addMainMethod(
+    SmaliBuilder builder = new SmaliBuilder(CLASS_NAME);
+    builder.addMainMethod(
         1,
         "const-string v0, \"" + BOO + "\"",
         "invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;",
@@ -44,16 +41,19 @@
     builder.addClass(BOO);
 
     List<String> pgConfigs = ImmutableList.of(
-        "-keep class Example { *; }",
+        "-keep class " + CLASS_NAME + " { *; }",
         "-keep,allowobfuscation class " + BOO,
         "-dontshrink",
         "-dontoptimize");
-    Path processedApp = runCompatProguard(builder, pgConfigs);
 
-    DexEncodedMethod method = getMethod(processedApp, main);
-    assertNotNull(method);
+    DexInspector inspector = runCompatProguard(builder, pgConfigs);
 
-    DexCode code = method.getCode().asDexCode();
+    ClassSubject clazz = inspector.clazz(CLASS_NAME);
+    assertTrue(clazz.isPresent());
+    MethodSubject method = clazz.method(DexInspector.MAIN);
+    assertTrue(method.isPresent());
+
+    DexCode code = method.getMethod().getCode().asDexCode();
     // TODO(b/36799092): DeadCodeRemover should be able to remove this instruction.
     assertTrue(code.instructions[0] instanceof ConstString);
     ConstString constString = (ConstString) code.instructions[0];
@@ -65,20 +65,49 @@
     assertTrue(code.instructions[3] instanceof ReturnVoid);
   }
 
-  private Path runCompatProguard(SmaliBuilder builder, List<String> proguardConfigurations) {
-    try {
-      Path dexOutputDir = temp.newFolder().toPath();
-      R8Command command =
-          new CompatProguardCommandBuilder(true, true)
-              .addDexProgramData(builder.compile())
-              .setOutputPath(dexOutputDir)
-              .addProguardConfiguration(proguardConfigurations)
-              .build();
-      ToolHelper.runR8(command);
-      return dexOutputDir.resolve("classes.dex");
-    } catch (CompilationException | IOException | RecognitionException | ExecutionException e) {
-      throw new RuntimeException(e);
-    }
+  @Test
+  public void forName_noMinification() throws Exception {
+    SmaliBuilder builder = new SmaliBuilder(CLASS_NAME);
+    builder.addMainMethod(
+        1,
+        "const-string v0, \"" + BOO + "\"",
+        "invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;",
+        "move-result-object v0",
+        "return-void");
+
+    builder.addClass(BOO);
+
+    List<String> pgConfigs = ImmutableList.of(
+        "-keep class " + CLASS_NAME +" { *; }",
+        "-keep class " + BOO,
+        "-dontshrink",
+        "-dontoptimize",
+        "-dontobfuscate");
+
+    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+
+    ClassSubject clazz = inspector.clazz(CLASS_NAME);
+    assertTrue(clazz.isPresent());
+    MethodSubject method = clazz.method(DexInspector.MAIN);
+    assertTrue(method.isPresent());
+
+    DexCode code = method.getMethod().getCode().asDexCode();
+    assertTrue(code.instructions[0] instanceof ConstString);
+    ConstString constString = (ConstString) code.instructions[0];
+    assertEquals(BOO, constString.getString().toString());
+    assertTrue(code.instructions[1] instanceof InvokeStatic);
+    assertTrue(code.instructions[2] instanceof ReturnVoid);
   }
 
+  private DexInspector runCompatProguard(SmaliBuilder builder, List<String> proguardConfigurations)
+      throws Exception{
+    Path dexOutputDir = temp.newFolder().toPath();
+    R8Command command =
+        new CompatProguardCommandBuilder(true, true)
+            .addDexProgramData(builder.compile())
+            .setOutputPath(dexOutputDir)
+            .addProguardConfiguration(proguardConfigurations)
+            .build();
+    return new DexInspector(ToolHelper.runR8(command));
+  }
 }
