diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index bd49aa1..5098368 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -155,7 +155,7 @@
 
       DexApplication app = new ApplicationReader(inputApp, options, timing).read(executor);
       PrefixRewritingMapper rewritePrefix =
-          options.desugaredLibraryConfiguration.createPrefixRewritingMapper(options.itemFactory);
+          options.desugaredLibraryConfiguration.createPrefixRewritingMapper(options);
       AppInfo appInfo =
           options.enableDesugaring ? new AppInfoWithClassHierarchy(app) : new AppInfo(app);
 
@@ -174,8 +174,8 @@
         }
       }
 
-      IRConverter converter =
-          new IRConverter(AppView.createForD8(appInfo, options, rewritePrefix), timing, printer);
+      AppView<?> appView = AppView.createForD8(appInfo, options, rewritePrefix);
+      IRConverter converter = new IRConverter(appView, timing, printer);
       app = converter.convert(app, executor);
 
       if (options.printCfg) {
@@ -220,7 +220,7 @@
               options,
               marker == null ? null : ImmutableList.copyOf(markers),
               GraphLense.getIdentityLense(),
-              PrefixRewritingNamingLens.createPrefixRewritingNamingLens(options, rewritePrefix),
+              PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView),
               null)
           .write(executor);
       options.printWarnings();
diff --git a/src/main/java/com/android/tools/r8/L8.java b/src/main/java/com/android/tools/r8/L8.java
index 45cb778f..87c15ab 100644
--- a/src/main/java/com/android/tools/r8/L8.java
+++ b/src/main/java/com/android/tools/r8/L8.java
@@ -114,7 +114,7 @@
 
       DexApplication app = new ApplicationReader(inputApp, options, timing).read(executor);
       PrefixRewritingMapper rewritePrefix =
-          options.desugaredLibraryConfiguration.createPrefixRewritingMapper(options.itemFactory);
+          options.desugaredLibraryConfiguration.createPrefixRewritingMapper(options);
 
       app = new L8TreePruner(options).prune(app, rewritePrefix);
       AppInfo appInfo = new AppInfoWithClassHierarchy(app);
@@ -134,7 +134,7 @@
               options,
               options.getMarker(Tool.L8),
               GraphLense.getIdentityLense(),
-              PrefixRewritingNamingLens.createPrefixRewritingNamingLens(options, rewritePrefix),
+              PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView),
               null)
           .write(options.getClassFileConsumer(), executor);
       options.printWarnings();
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index dbe1572..1c7774d 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -783,8 +783,7 @@
           application,
           appView,
           appView.graphLense(),
-          PrefixRewritingNamingLens.createPrefixRewritingNamingLens(
-              options, appView.rewritePrefix, namingLens),
+          PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView, namingLens),
           options,
           proguardMapSupplier);
 
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java
index 650bf61..1581a5e 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -70,8 +70,7 @@
         options,
         appInfo == null
             ? PrefixRewritingMapper.empty()
-            : options.desugaredLibraryConfiguration.createPrefixRewritingMapper(
-                options.itemFactory));
+            : options.desugaredLibraryConfiguration.createPrefixRewritingMapper(options));
   }
 
   private AppView(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index 8c632a2..acdad7d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -507,13 +507,13 @@
       // They however require the Optional/Stream class to be present, either through
       // desugared libraries or natively. If Optional/Stream class is not present,
       // we do not desugar to avoid confusion in error messages.
-      if (appView.rewritePrefix.hasRewrittenType(factory.optionalType)
+      if (appView.rewritePrefix.hasRewrittenType(factory.optionalType, appView)
           || options.minApiLevel >= AndroidApiLevel.N.getLevel()) {
         initializeJava9OptionalMethodProviders(factory);
         initializeJava10OptionalMethodProviders(factory);
         initializeJava11OptionalMethodProviders(factory);
       }
-      if (appView.rewritePrefix.hasRewrittenType(factory.streamType)
+      if (appView.rewritePrefix.hasRewrittenType(factory.streamType, appView)
           || options.minApiLevel >= AndroidApiLevel.N.getLevel()) {
         initializeStreamMethodProviders(factory);
       }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
index 4483eca..dc0e8d6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
@@ -101,7 +101,7 @@
         InvokeMethod invokeMethod = instruction.asInvokeMethod();
         DexMethod invokedMethod = invokeMethod.getInvokedMethod();
         // Rewriting is required only on calls to library methods which are not desugared.
-        if (appView.rewritePrefix.hasRewrittenType(invokedMethod.holder)
+        if (appView.rewritePrefix.hasRewrittenType(invokedMethod.holder, appView)
             || invokedMethod.holder.isArrayType()) {
           continue;
         }
@@ -111,7 +111,7 @@
         }
         // Library methods do not understand desugared types, hence desugared types have to be
         // converted around non desugared library calls for the invoke to resolve.
-        if (appView.rewritePrefix.hasRewrittenTypeInSignature(invokedMethod.proto)) {
+        if (appView.rewritePrefix.hasRewrittenTypeInSignature(invokedMethod.proto, appView)) {
           rewriteLibraryInvoke(code, invokeMethod, iterator, blockIterator);
         }
       }
@@ -131,7 +131,7 @@
     }
     DexMethod method = code.method.method;
     if (method.holder.isArrayType()
-        || !appView.rewritePrefix.hasRewrittenTypeInSignature(method.proto)
+        || !appView.rewritePrefix.hasRewrittenTypeInSignature(method.proto, appView)
         || appView
             .options()
             .desugaredLibraryConfiguration
@@ -173,7 +173,7 @@
       DexEncodedMethod dexEncodedMethod = dexClass.lookupVirtualMethod(method);
       if (dexEncodedMethod != null) {
         // In this case, the object will be wrapped.
-        if (appView.rewritePrefix.hasRewrittenType(dexClass.type)) {
+        if (appView.rewritePrefix.hasRewrittenType(dexClass.type, appView)) {
           return false;
         }
         foundOverrideToRewrite = true;
@@ -211,14 +211,14 @@
     DexType[] newParameters = originalMethod.proto.parameters.values.clone();
     int index = 0;
     for (DexType param : originalMethod.proto.parameters.values) {
-      if (appView.rewritePrefix.hasRewrittenType(param)) {
+      if (appView.rewritePrefix.hasRewrittenType(param, appView)) {
         newParameters[index] = vivifiedTypeFor(param, appView);
       }
       index++;
     }
     DexType returnType = originalMethod.proto.returnType;
     DexType newReturnType =
-        appView.rewritePrefix.hasRewrittenType(returnType)
+        appView.rewritePrefix.hasRewrittenType(returnType, appView)
             ? vivifiedTypeFor(returnType, appView)
             : returnType;
     DexProto newProto = appView.dexItemFactory().createProto(newReturnType, newParameters);
@@ -270,7 +270,7 @@
   }
 
   private void warnInvalidInvoke(DexType type, DexMethod invokedMethod, String debugString) {
-    DexType desugaredType = appView.rewritePrefix.rewrittenType(type);
+    DexType desugaredType = appView.rewritePrefix.rewrittenType(type, appView);
     appView
         .options()
         .reporter
@@ -310,7 +310,7 @@
     Instruction returnConversion = null;
     DexType newReturnType;
     DexType returnType = invokedMethod.proto.returnType;
-    if (appView.rewritePrefix.hasRewrittenType(returnType)) {
+    if (appView.rewritePrefix.hasRewrittenType(returnType, appView)) {
       if (canConvert(returnType)) {
         newReturnType = vivifiedTypeFor(returnType, appView);
         // Return conversion added only if return value is used.
@@ -332,7 +332,7 @@
     List<Instruction> parameterConversions = new ArrayList<>();
     List<Value> newInValues = new ArrayList<>();
     if (invokeMethod.isInvokeMethodWithReceiver()) {
-      assert !appView.rewritePrefix.hasRewrittenType(invokedMethod.holder);
+      assert !appView.rewritePrefix.hasRewrittenType(invokedMethod.holder, appView);
       newInValues.add(invokeMethod.asInvokeMethodWithReceiver().getReceiver());
     }
     int receiverShift = BooleanUtils.intValue(invokeMethod.isInvokeMethodWithReceiver());
@@ -340,7 +340,7 @@
     DexType[] newParameters = parameters.clone();
     for (int i = 0; i < parameters.length; i++) {
       DexType argType = parameters[i];
-      if (appView.rewritePrefix.hasRewrittenType(argType)) {
+      if (appView.rewritePrefix.hasRewrittenType(argType, appView)) {
         if (canConvert(argType)) {
           DexType argVivifiedType = vivifiedTypeFor(argType, appView);
           Value inValue = invokeMethod.inValues().get(i + receiverShift);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryConfiguration.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryConfiguration.java
index 3d0a59c..bdb4cd9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryConfiguration.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryConfiguration.java
@@ -13,6 +13,7 @@
 import com.android.tools.r8.ir.desugar.PrefixRewritingMapper.DesugarPrefixRewritingMapper;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Pair;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -47,7 +48,7 @@
       Map<String, String> prefix) {
     return new DesugaredLibraryConfiguration(
         AndroidApiLevel.B,
-        false,
+        true,
         FALL_BACK_SYNTHESIZED_CLASSES_PACKAGE_PREFIX,
         prefix,
         ImmutableMap.of(),
@@ -95,10 +96,10 @@
     this.extraKeepRules = extraKeepRules;
   }
 
-  public PrefixRewritingMapper createPrefixRewritingMapper(DexItemFactory factory) {
+  public PrefixRewritingMapper createPrefixRewritingMapper(InternalOptions options) {
     return rewritePrefix.isEmpty()
         ? PrefixRewritingMapper.empty()
-        : new DesugarPrefixRewritingMapper(rewritePrefix, factory);
+        : new DesugarPrefixRewritingMapper(rewritePrefix, options);
   }
 
   public AndroidApiLevel getRequiredCompilationApiLevel() {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
index 328d8e2..bcae8e7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
@@ -393,7 +393,7 @@
     }
     // Since desugared library classes are desugared, no need to rewrite invokes which can target
     // only such classes program types.
-    if (appView.rewritePrefix.hasRewrittenType(dexClass.type)) {
+    if (appView.rewritePrefix.hasRewrittenType(dexClass.type, appView)) {
       return null;
     }
     DexEncodedMethod singleTarget =
@@ -438,7 +438,7 @@
     if (emulatedInterfaces.containsKey(clazz.type)) {
       return true;
     }
-    return appView.rewritePrefix.hasRewrittenType(clazz.type);
+    return appView.rewritePrefix.hasRewrittenType(clazz.type, appView);
   }
 
   boolean dontRewrite(DexMethod method) {
@@ -792,7 +792,7 @@
     for (DexClass clazz : appView.appInfo().classes()) {
       if (clazz.isInterface()) {
         DexType newType = inferEmulatedInterfaceName(clazz);
-        if (newType != null && !appView.rewritePrefix.hasRewrittenType(clazz.type)) {
+        if (newType != null && !appView.rewritePrefix.hasRewrittenType(clazz.type, appView)) {
           // We do not rewrite if it is already going to be rewritten using the a rewritingPrefix.
           addRewritePrefix(clazz.type, newType.toString());
           renameEmulatedInterfaces(clazz, newType);
@@ -1050,7 +1050,7 @@
   private void warnMissingType(DexMethod referencedFrom, DexType missing) {
     // Companion/Emulated interface/Conversion classes for desugared library won't be missing,
     // they are in the desugared library.
-    if (appView.rewritePrefix.hasRewrittenType(missing)
+    if (appView.rewritePrefix.hasRewrittenType(missing, appView)
         || DesugaredLibraryWrapperSynthesizer.isSynthesizedWrapper(missing)
         || isCompanionClassType(missing)
         || appView
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
index 6ae855c..2fd29e1 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
@@ -361,7 +361,8 @@
               lambdaClassType,
               new LambdaClass(this, accessedFrom, lambdaClassType, descriptor));
       if (getAppView().options().isDesugaredLibraryCompilation()) {
-        DexType rewrittenType = getAppView().rewritePrefix.rewrittenType(accessedFrom);
+        DexType rewrittenType =
+            getAppView().rewritePrefix.rewrittenType(accessedFrom, getAppView());
         if (rewrittenType == null) {
           rewrittenType =
               getAppView()
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/PrefixRewritingMapper.java b/src/main/java/com/android/tools/r8/ir/desugar/PrefixRewritingMapper.java
index 1549b58..1c3b6a2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/PrefixRewritingMapper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/PrefixRewritingMapper.java
@@ -5,11 +5,14 @@
 package com.android.tools.r8.ir.desugar;
 
 import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
 import java.util.Map;
@@ -22,20 +25,20 @@
     return new EmptyPrefixRewritingMapper();
   }
 
-  public abstract DexType rewrittenType(DexType type);
-
   public abstract void rewriteType(DexType type, DexType rewrittenType);
 
-  public boolean hasRewrittenType(DexType type) {
-    return rewrittenType(type) != null;
+  public abstract DexType rewrittenType(DexType type, AppView<?> appView);
+
+  public boolean hasRewrittenType(DexType type, AppView<?> appView) {
+    return rewrittenType(type, appView) != null;
   }
 
-  public boolean hasRewrittenTypeInSignature(DexProto proto) {
-    if (hasRewrittenType(proto.returnType)) {
+  public boolean hasRewrittenTypeInSignature(DexProto proto, AppView<?> appView) {
+    if (hasRewrittenType(proto.returnType, appView)) {
       return true;
     }
     for (DexType paramType : proto.parameters.values) {
-      if (hasRewrittenType(paramType)) {
+      if (hasRewrittenType(paramType, appView)) {
         return true;
       }
     }
@@ -50,9 +53,11 @@
     private final Map<DexType, DexType> rewritten = new ConcurrentHashMap<>();
     private final Map<DexString, DexString> initialPrefixes;
     private final DexItemFactory factory;
+    private final boolean l8Compilation;
 
-    public DesugarPrefixRewritingMapper(Map<String, String> prefixes, DexItemFactory factory) {
-      this.factory = factory;
+    public DesugarPrefixRewritingMapper(Map<String, String> prefixes, InternalOptions options) {
+      this.factory = options.itemFactory;
+      this.l8Compilation = options.isDesugaredLibraryCompilation();
       ImmutableMap.Builder<DexString, DexString> builder = ImmutableMap.builder();
       for (String key : prefixes.keySet()) {
         builder.put(toDescriptorPrefix(key), toDescriptorPrefix(prefixes.get(key)));
@@ -97,14 +102,34 @@
     }
 
     @Override
-    public DexType rewrittenType(DexType type) {
+    public DexType rewrittenType(DexType type, AppView<?> appView) {
+      assert appView != null || l8Compilation;
       if (notRewritten.contains(type)) {
         return null;
       }
       if (rewritten.containsKey(type)) {
         return rewritten.get(type);
       }
-      return computePrefix(type);
+      return computePrefix(type, appView);
+    }
+
+    // Besides L8 compilation, program types should not be rewritten.
+    private void failIfRewritingProgramType(DexType type, AppView<?> appView) {
+      if (l8Compilation) {
+        return;
+      }
+
+      DexType dexType = type.isArrayType() ? type.toBaseType(appView.dexItemFactory()) : type;
+      DexClass dexClass = appView.definitionFor(dexType);
+      if (dexClass != null && dexClass.isProgramClass()) {
+        appView
+            .options()
+            .reporter
+            .error(
+                "Cannot compile program class "
+                    + dexType
+                    + " since it conflicts with a desugared library rewriting rule.");
+      }
     }
 
     @Override
@@ -122,10 +147,11 @@
       rewritten.put(type, rewrittenType);
     }
 
-    private DexType computePrefix(DexType type) {
+    private DexType computePrefix(DexType type, AppView<?> appView) {
       DexString prefixToMatch = type.descriptor.withoutArray(factory);
       DexType result = lookup(type, prefixToMatch, initialPrefixes);
       if (result != null) {
+        failIfRewritingProgramType(type, appView);
         return result;
       }
       notRewritten.add(type);
@@ -155,7 +181,7 @@
   public static class EmptyPrefixRewritingMapper extends PrefixRewritingMapper {
 
     @Override
-    public DexType rewrittenType(DexType type) {
+    public DexType rewrittenType(DexType type, AppView<?> appView) {
       return null;
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/DesugaredLibraryAPIConversionCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/DesugaredLibraryAPIConversionCfCodeProvider.java
index 5597bb5..422bc2f 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/DesugaredLibraryAPIConversionCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/DesugaredLibraryAPIConversionCfCodeProvider.java
@@ -43,7 +43,7 @@
 
   boolean shouldConvert(
       DexType type, DesugaredLibraryAPIConverter converter, DexString methodName) {
-    if (!appView.rewritePrefix.hasRewrittenType(type)) {
+    if (!appView.rewritePrefix.hasRewrittenType(type, appView)) {
       return false;
     }
     if (converter.canConvert(type)) {
@@ -118,7 +118,7 @@
 
       DexType returnType = forwardMethod.proto.returnType;
       DexType forwardMethodReturnType =
-          appView.rewritePrefix.hasRewrittenType(returnType)
+          appView.rewritePrefix.hasRewrittenType(returnType, appView)
               ? vivifiedTypeFor(returnType)
               : returnType;
 
diff --git a/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java b/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
index f12d958..8d2e79f 100644
--- a/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
@@ -280,7 +280,7 @@
           state.reserveName(reservedName, method.method);
           // This is reserving names which after prefix rewriting will actually override a library
           // method.
-          if (appView.rewritePrefix.hasRewrittenTypeInSignature(method.method.proto)) {
+          if (appView.rewritePrefix.hasRewrittenTypeInSignature(method.method.proto, appView)) {
             state.reserveName(
                 reservedName,
                 DesugaredLibraryAPIConverter.methodWithVivifiedTypeInSignature(
diff --git a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
index e1dc8a6..777d006 100644
--- a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.naming;
 
 import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexCallSite;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItem;
@@ -31,28 +32,27 @@
   final NamingLens namingLens;
   final InternalOptions options;
 
-  public static NamingLens createPrefixRewritingNamingLens(
-      InternalOptions options, PrefixRewritingMapper rewritePrefix) {
-    return createPrefixRewritingNamingLens(options, rewritePrefix, NamingLens.getIdentityLens());
+  public static NamingLens createPrefixRewritingNamingLens(AppView<?> appView) {
+    return createPrefixRewritingNamingLens(appView, NamingLens.getIdentityLens());
   }
 
   public static NamingLens createPrefixRewritingNamingLens(
-      InternalOptions options, PrefixRewritingMapper rewritePrefix, NamingLens namingLens) {
-    if (!rewritePrefix.isRewriting()) {
+      AppView<?> appView, NamingLens namingLens) {
+    if (!appView.rewritePrefix.isRewriting()) {
       return namingLens;
     }
-    return new PrefixRewritingNamingLens(namingLens, options, rewritePrefix);
+    return new PrefixRewritingNamingLens(namingLens, appView);
   }
 
-  public PrefixRewritingNamingLens(
-      NamingLens namingLens, InternalOptions options, PrefixRewritingMapper rewritePrefix) {
+  public PrefixRewritingNamingLens(NamingLens namingLens, AppView<?> appView) {
     this.namingLens = namingLens;
-    this.options = options;
+    this.options = appView.options();
     DexItemFactory itemFactory = options.itemFactory;
+    PrefixRewritingMapper rewritePrefix = appView.rewritePrefix;
     itemFactory.forAllTypes(
         type -> {
-          if (rewritePrefix.hasRewrittenType(type)) {
-            classRenaming.put(type, rewritePrefix.rewrittenType(type).descriptor);
+          if (rewritePrefix.hasRewrittenType(type, appView)) {
+            classRenaming.put(type, rewritePrefix.rewrittenType(type, appView).descriptor);
           }
         });
     // Verify that no type would have been renamed by both lenses.
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 1b76214..2884fcd 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -1645,7 +1645,7 @@
       // In the first enqueuer phase, the signature has not been desugared, so firstResolution
       // maintains the library override. In the second enqueuer phase, the signature has been
       // desugared, and the second resolution maintains the the library override.
-      if (appView.rewritePrefix.hasRewrittenTypeInSignature(method.method.proto)) {
+      if (appView.rewritePrefix.hasRewrittenTypeInSignature(method.method.proto, appView)) {
         DexMethod methodToResolve =
             DesugaredLibraryAPIConverter.methodWithVivifiedTypeInSignature(
                 method.method, method.method.holder, appView);
diff --git a/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java b/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java
index 20595c7..8e5e7a3 100644
--- a/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java
@@ -43,7 +43,7 @@
     }
     List<DexProgramClass> toKeep = new ArrayList<>();
     for (DexProgramClass aClass : app.classes()) {
-      if (rewritePrefix.hasRewrittenType(aClass.type)
+      if (rewritePrefix.hasRewrittenType(aClass.type, null)
           || emulatedInterfaces.contains(aClass.type)
           || interfaceImplementsEmulatedInterface(aClass, typeMap)) {
         toKeep.add(aClass);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java
new file mode 100644
index 0000000..3c78730
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java
@@ -0,0 +1,158 @@
+// Copyright (c) 2020, 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.desugar.desugaredlibrary;
+
+import static junit.framework.TestCase.assertTrue;
+import static junit.framework.TestCase.fail;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestRuntime;
+import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.BooleanUtils;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.List;
+import org.junit.Assume;
+import org.junit.BeforeClass;
+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 J$ExtensionTest extends DesugaredLibraryTestBase {
+
+  private final TestParameters parameters;
+  private final boolean shrinkDesugaredLibrary;
+
+  private static final String MAIN_CLASS_NAME = "Main";
+  private static final String MAIN_CLASS =
+      "import java.time.LocalTimeAccess;\n"
+          + "public class Main {\n"
+          + "   public static void main(String[] args) throws Exception { \n"
+          + "     LocalTimeAccess.main(new String[0]);\n"
+          + "   }\n"
+          + "}";
+
+  private static final String TIME_CLASS =
+      "package java.time;\n"
+          + "\n"
+          + "import java.time.LocalTime;\n"
+          + "\n"
+          + "public class LocalTimeAccess {\n"
+          + "\n"
+          + "  public static void main(String[] args) throws Exception {\n"
+          + "    System.out.println(LocalTime.readExternal(null));\n"
+          + "  }\n"
+          + "}";
+  private static Path[] compiledClasses = new Path[2];
+
+  @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        BooleanUtils.values(), getTestParameters().withAllRuntimes().withAllApiLevels().build());
+  }
+
+  public J$ExtensionTest(boolean shrinkDesugaredLibrary, TestParameters parameters) {
+    this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
+    this.parameters = parameters;
+  }
+
+  @BeforeClass
+  public static void compileClass() throws IOException {
+    Assume.assumeFalse(ToolHelper.isWindows());
+
+    File file1 = getStaticTemp().newFile("LocalTimeAccess.java");
+    BufferedWriter writer1 = new BufferedWriter(new FileWriter(file1));
+    writer1.write(TIME_CLASS);
+    writer1.close();
+    compiledClasses[0] =
+        javac(TestRuntime.getCheckedInJdk8(), getStaticTemp())
+            .addSourceFiles(file1.toPath())
+            .compile();
+
+    File file2 = getStaticTemp().newFile("Main.java");
+    BufferedWriter writer2 = new BufferedWriter(new FileWriter(file2));
+    writer2.write(MAIN_CLASS);
+    writer2.close();
+    compiledClasses[1] =
+        javac(TestRuntime.getCheckedInJdk8(), getStaticTemp())
+            .addSourceFiles(file2.toPath())
+            .addClasspathFiles(compiledClasses[0])
+            .compile();
+  }
+
+  @Test
+  public void testJ$ExtensionNoDesugaring() throws Exception {
+    Assume.assumeFalse(shrinkDesugaredLibrary);
+    String stderr;
+    if (parameters.isCfRuntime()) {
+      stderr =
+          testForJvm()
+              .addProgramFiles(compiledClasses)
+              .run(parameters.getRuntime(), MAIN_CLASS_NAME)
+              .assertFailure()
+              .getStdErr();
+    } else {
+      stderr =
+          testForD8()
+              .addProgramFiles(compiledClasses)
+              .setMinApi(parameters.getApiLevel())
+              .run(parameters.getRuntime(), MAIN_CLASS_NAME)
+              .assertFailure()
+              .getStdErr();
+    }
+    assertError(stderr);
+  }
+
+  private void assertError(String stderr) {
+    if (parameters.isCfRuntime() && parameters.getRuntime().asCf().getVm() == CfVm.JDK8) {
+      assertTrue(
+          stderr.contains("java.lang.SecurityException: Prohibited package name: java.time"));
+    } else if (parameters.isCfRuntime()) {
+      assertTrue(stderr.contains("java.lang.ClassNotFoundException: java.time.LocalTimeAccess"));
+    } else if (parameters
+        .getRuntime()
+        .asDex()
+        .getVm()
+        .getVersion()
+        .isOlderThanOrEqual(Version.V6_0_1)) {
+      assertTrue(stderr.contains("java.lang.NoClassDefFoundError"));
+    } else if (parameters.getRuntime().asDex().getVm().getVersion() == Version.V7_0_0) {
+      assertTrue(stderr.contains("java.lang.ClassNotFoundException"));
+    } else {
+      assertTrue(stderr.contains("java.lang.IllegalAccessError"));
+    }
+  }
+
+  @Test
+  public void testJ$ExtensionDesugaring() throws Exception {
+    Assume.assumeFalse(parameters.isCfRuntime());
+    // Above O no desugaring is required.
+    Assume.assumeTrue(parameters.getApiLevel().getLevel() < AndroidApiLevel.O.getLevel());
+    KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
+
+    try {
+      testForD8()
+          .addProgramFiles(compiledClasses)
+          .setMinApi(parameters.getApiLevel())
+          .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
+          .compile();
+      fail();
+    } catch (CompilationFailedException e) {
+      assertTrue(
+          e.getCause()
+              .getMessage()
+              .contains("Cannot compile program class java.time.LocalTimeAccess"));
+    }
+  }
+}
