diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index ae8d4ae..5c0e9f7 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -660,13 +660,7 @@
 
       // Perform minification.
       NamingLens namingLens;
-      if (options.configurationDebugging) {
-        if (options.getProguardConfiguration().hasApplyMappingFile() || options.isMinifying()) {
-          options.reporter.info(new StringDiagnostic(
-              "Build is not being obfuscated due to the use of -addconfigurationdebugging"));
-        }
-        namingLens = NamingLens.getIdentityLens();
-      } else if (options.getProguardConfiguration().hasApplyMappingFile()) {
+      if (options.getProguardConfiguration().hasApplyMappingFile()) {
         SeedMapper seedMapper =
             SeedMapper.seedMapperFromFile(
                 options.reporter, options.getProguardConfiguration().getApplyMappingFile());
@@ -680,6 +674,7 @@
         namingLens = new Minifier(appView.withLiveness(), desugaredCallSites).run(timing);
         timing.end();
       } else {
+        // Rewrite signature annotations for applications that are not minified.
         if (appView.appInfo().hasLiveness()) {
           // TODO(b/124726014): Rewrite signature annotations in lens rewriting instead of here?
           new GenericSignatureRewriter(appView.withLiveness()).run(appView.appInfo().classes());
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 375cc0b..6fce43b 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.5.35";
+  public static final String LABEL = "1.5.36";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
index 9d0adec..bfad990 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
@@ -167,6 +167,10 @@
       this.applyMappingFile = file;
     }
 
+    public boolean hasApplyMappingFile() {
+      return applyMappingFile != null;
+    }
+
     public void setVerbose(boolean verbose) {
       this.verbose = verbose;
     }
@@ -276,6 +280,10 @@
       this.configurationDebugging = configurationDebugging;
     }
 
+    boolean isConfigurationDebugging() {
+      return configurationDebugging;
+    }
+
     public void setDontUseMixedCaseClassnames(boolean dontUseMixedCaseClassnames) {
       this.dontUseMixedCaseClassnames = dontUseMixedCaseClassnames;
     }
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index a3d58a1..bc3b2ff 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -128,6 +128,20 @@
           configurationBuilder.getKeepParameterNamesOptionOrigin(),
           configurationBuilder.getKeepParameterNamesOptionPosition()));
     }
+    if (configurationBuilder.isConfigurationDebugging()) {
+      String suffix = "due to the use of -addconfigurationdebugging";
+      if (configurationBuilder.isObfuscating()) {
+        reporter.info(
+            new StringDiagnostic("Build is not being obfuscated " + suffix));
+        configurationBuilder.disableObfuscation();
+      }
+      if (configurationBuilder.hasApplyMappingFile()) {
+        reporter.info(
+            new StringDiagnostic(
+                "Applying the obfuscation map (-applymapping) is disabled " + suffix));
+        configurationBuilder.setApplyMappingFile(null);
+      }
+    }
   }
 
   /**
diff --git a/src/test/java/com/android/tools/r8/naming/b132460884/LocalClassRenamingTest.java b/src/test/java/com/android/tools/r8/naming/b132460884/LocalClassRenamingTest.java
index 4d82789..eb17213 100644
--- a/src/test/java/com/android/tools/r8/naming/b132460884/LocalClassRenamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/b132460884/LocalClassRenamingTest.java
@@ -29,7 +29,7 @@
     this.map = new HashMap<>();
   }
 
-  public static <K, V> TestMap of(K k, V v) {
+  public static <K, V> TestMap<K, V> of(K k, V v) {
     TestMap<K, V> m = new TestMap<>();
     m.map.put(k, v);
     return m;
diff --git a/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/B133167042.java b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/B133167042.java
new file mode 100644
index 0000000..725fe66
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/B133167042.java
@@ -0,0 +1,53 @@
+// Copyright (c) 2019, 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.shaking.addconfigurationdebugging;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.StringUtils;
+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 B133167042 extends TestBase {
+
+  static class TestClass {
+    public static void main(String... args) {
+      boolean onAndroid = false;
+      try {
+        // Intentional typo not to set `onAndroid`.
+        Class.forName("android.os.Bui1d");
+        onAndroid = true;
+      } catch (ClassNotFoundException e) {
+        // Intentionally empty
+      }
+      System.out.println(onAndroid);
+    }
+  }
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimes().build();
+  }
+
+  private final TestParameters parameters;
+
+  public B133167042(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void test() throws Exception {
+    testForR8(parameters.getBackend())
+        .addProgramClasses(TestClass.class)
+        .addKeepMainRule(TestClass.class)
+        .addKeepRules("-addconfigurationdebugging")
+        .setMinApi(parameters.getRuntime())
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutput(StringUtils.lines("false"));
+  }
+}
