diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
index 57f7c3e..de5d525 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
@@ -55,6 +55,7 @@
       "api_level_below_or_equal": 23,
       "rewrite_prefix": {
         "java.io.DesugarBufferedReader": "j$.io.DesugarBufferedReader",
+        "java.io.UncheckedIOException": "j$.io.UncheckedIOException",
         "java.util.DoubleSummaryStatistics": "j$.util.DoubleSummaryStatistics",
         "java.util.IntSummaryStatistics": "j$.util.IntSummaryStatistics",
         "java.util.LongSummaryStatistics": "j$.util.LongSummaryStatistics",
@@ -69,9 +70,6 @@
         "java.util.function.": "j$.util.function.",
         "java.util.stream.": "j$.util.stream."
       },
-      "maintain_prefix": [
-        "java.io.UncheckedIOException"
-      ],
       "emulate_interface": {
         "java.lang.Iterable": "j$.lang.Iterable",
         "java.util.Collection": "j$.util.Collection",
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index acbd677..7f74668 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -539,6 +539,7 @@
     assert !internal.isMinifying();
     assert !internal.passthroughDexCode;
     internal.passthroughDexCode = true;
+    assert internal.neverMergePrefixes.contains("j$.");
 
     // Assert some of R8 optimizations are disabled.
     assert !internal.inlinerOptions().enableInlining;
diff --git a/src/main/java/com/android/tools/r8/dex/CodeToKeep.java b/src/main/java/com/android/tools/r8/dex/CodeToKeep.java
index 7bfd947..3e33ca8 100644
--- a/src/main/java/com/android/tools/r8/dex/CodeToKeep.java
+++ b/src/main/java/com/android/tools/r8/dex/CodeToKeep.java
@@ -25,7 +25,6 @@
 
   static CodeToKeep createCodeToKeep(InternalOptions options, NamingLens namingLens) {
     if ((!namingLens.hasPrefixRewritingLogic()
-            && options.machineDesugaredLibrarySpecification.getMaintainType().isEmpty()
             && !options.machineDesugaredLibrarySpecification.hasEmulatedInterfaces())
         || options.isDesugaredLibraryCompilation()
         || options.testing.enableExperimentalDesugaredLibraryKeepRuleGenerator) {
@@ -68,7 +67,6 @@
 
     private boolean shouldKeep(DexType type) {
       return namingLens.prefixRewrittenType(type) != null
-          || options.machineDesugaredLibrarySpecification.getMaintainType().contains(type)
           || options.machineDesugaredLibrarySpecification.isCustomConversionRewrittenType(type)
           || options.machineDesugaredLibrarySpecification.isEmulatedInterfaceRewrittenType(type)
           // TODO(b/158632510): This should prefix match on DexString.
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
index 72cbe7d..c283797 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ArrayTypeElement.java
@@ -28,7 +28,6 @@
       Nullability nullability,
       NullabilityVariants<ArrayTypeElement> variants) {
     super(nullability);
-    assert memberTypeLattice.isPrimitiveType() || memberTypeLattice.nullability().isMaybeNull();
     this.memberTypeLattice = memberTypeLattice;
     this.variants = variants;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
index 5499ffb..2eb550b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
@@ -48,7 +48,6 @@
   static final String WRAPPER_CONVERSION_EXCLUDING_KEY = "wrapper_conversion_excluding";
   static final String CUSTOM_CONVERSION_KEY = "custom_conversion";
   static final String REWRITE_PREFIX_KEY = "rewrite_prefix";
-  static final String MAINTAIN_PREFIX_KEY = "maintain_prefix";
   static final String RETARGET_METHOD_KEY = "retarget_method";
   static final String RETARGET_METHOD_EMULATED_DISPATCH_KEY =
       "retarget_method_with_emulated_dispatch";
@@ -236,11 +235,6 @@
         builder.putRewritePrefix(rewritePrefix.getKey(), rewritePrefix.getValue().getAsString());
       }
     }
-    if (jsonFlagSet.has(MAINTAIN_PREFIX_KEY)) {
-      for (JsonElement maintainPrefix : jsonFlagSet.get(MAINTAIN_PREFIX_KEY).getAsJsonArray()) {
-        builder.putMaintainPrefix(maintainPrefix.getAsString());
-      }
-    }
     if (jsonFlagSet.has(REWRITE_DERIVED_PREFIX_KEY)) {
       for (Map.Entry<String, JsonElement> prefixToMatch :
           jsonFlagSet.get(REWRITE_DERIVED_PREFIX_KEY).getAsJsonObject().entrySet()) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
index 8f4c435..9eb3ed7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
@@ -24,7 +24,6 @@
 public class HumanRewritingFlags {
 
   private final Map<String, String> rewritePrefix;
-  private final Set<String> maintainPrefix;
   private final Map<String, Map<String, String>> rewriteDerivedPrefix;
   private final Map<DexType, DexType> emulatedInterfaces;
   private final Map<DexMethod, DexType> retargetMethod;
@@ -38,7 +37,6 @@
 
   HumanRewritingFlags(
       Map<String, String> rewritePrefix,
-      Set<String> maintainPrefix,
       Map<String, Map<String, String>> rewriteDerivedPrefix,
       Map<DexType, DexType> emulateLibraryInterface,
       Map<DexMethod, DexType> retargetMethod,
@@ -50,7 +48,6 @@
       Map<DexType, Set<DexMethod>> wrapperConversion,
       Map<DexMethod, MethodAccessFlags> amendLibraryMethod) {
     this.rewritePrefix = rewritePrefix;
-    this.maintainPrefix = maintainPrefix;
     this.rewriteDerivedPrefix = rewriteDerivedPrefix;
     this.emulatedInterfaces = emulateLibraryInterface;
     this.retargetMethod = retargetMethod;
@@ -66,7 +63,6 @@
   public static HumanRewritingFlags empty() {
     return new HumanRewritingFlags(
         ImmutableMap.of(),
-        ImmutableSet.of(),
         ImmutableMap.of(),
         ImmutableMap.of(),
         ImmutableMap.of(),
@@ -88,7 +84,6 @@
         reporter,
         origin,
         rewritePrefix,
-        maintainPrefix,
         rewriteDerivedPrefix,
         emulatedInterfaces,
         retargetMethod,
@@ -105,10 +100,6 @@
     return rewritePrefix;
   }
 
-  public Set<String> getMaintainPrefix() {
-    return maintainPrefix;
-  }
-
   public Map<String, Map<String, String>> getRewriteDerivedPrefix() {
     return rewriteDerivedPrefix;
   }
@@ -162,7 +153,6 @@
     private final Origin origin;
 
     private final Map<String, String> rewritePrefix;
-    private final Set<String> maintainPrefix;
     private final Map<String, Map<String, String>> rewriteDerivedPrefix;
     private final Map<DexType, DexType> emulatedInterfaces;
     private final Map<DexMethod, DexType> retargetMethod;
@@ -179,7 +169,6 @@
           reporter,
           origin,
           new HashMap<>(),
-          Sets.newIdentityHashSet(),
           new HashMap<>(),
           new IdentityHashMap<>(),
           new IdentityHashMap<>(),
@@ -196,7 +185,6 @@
         Reporter reporter,
         Origin origin,
         Map<String, String> rewritePrefix,
-        Set<String> maintainPrefix,
         Map<String, Map<String, String>> rewriteDerivedPrefix,
         Map<DexType, DexType> emulateLibraryInterface,
         Map<DexMethod, DexType> retargetMethod,
@@ -210,7 +198,6 @@
       this.reporter = reporter;
       this.origin = origin;
       this.rewritePrefix = new HashMap<>(rewritePrefix);
-      this.maintainPrefix = Sets.newHashSet(maintainPrefix);
       this.rewriteDerivedPrefix = new HashMap<>(rewriteDerivedPrefix);
       this.emulatedInterfaces = new IdentityHashMap<>(emulateLibraryInterface);
       this.retargetMethod = new IdentityHashMap<>(retargetMethod);
@@ -250,11 +237,6 @@
       return this;
     }
 
-    public Builder putMaintainPrefix(String prefix) {
-      maintainPrefix.add(prefix);
-      return this;
-    }
-
     public Builder putRewriteDerivedPrefix(
         String prefixToMatch, String prefixToRewrite, String rewrittenPrefix) {
       Map<String, String> map =
@@ -340,7 +322,6 @@
       validate();
       return new HumanRewritingFlags(
           ImmutableMap.copyOf(rewritePrefix),
-          ImmutableSet.copyOf(maintainPrefix),
           ImmutableMap.copyOf(rewriteDerivedPrefix),
           ImmutableMap.copyOf(emulatedInterfaces),
           ImmutableMap.copyOf(retargetMethod),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
index 735d4f0..1f52b3d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
@@ -82,10 +82,6 @@
     return rewritingFlags.getRewriteType();
   }
 
-  public Set<DexType> getMaintainType() {
-    return rewritingFlags.getMaintainType();
-  }
-
   public Map<DexType, DexType> getRewriteDerivedTypeOnly() {
     return rewritingFlags.getRewriteDerivedTypeOnly();
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
index 0f1aef3..00a4747 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
@@ -25,7 +25,6 @@
 
   MachineRewritingFlags(
       Map<DexType, DexType> rewriteType,
-      Set<DexType> maintainType,
       Map<DexType, DexType> rewriteDerivedTypeOnly,
       Map<DexMethod, DexMethod> staticRetarget,
       Map<DexMethod, DexMethod> nonEmulatedVirtualRetarget,
@@ -38,7 +37,6 @@
       Map<DexType, CustomConversionDescriptor> customConversions,
       Map<DexMethod, MethodAccessFlags> amendLibraryMethods) {
     this.rewriteType = rewriteType;
-    this.maintainType = maintainType;
     this.rewriteDerivedTypeOnly = rewriteDerivedTypeOnly;
     this.staticRetarget = staticRetarget;
     this.nonEmulatedVirtualRetarget = nonEmulatedVirtualRetarget;
@@ -55,8 +53,6 @@
 
   // Rewrites all the references to the keys as well as synthetic types derived from any key.
   private final Map<DexType, DexType> rewriteType;
-  // Maintains the references in the desugared library dex file.
-  private final Set<DexType> maintainType;
   // Rewrites only synthetic types derived from any key.
   private final Map<DexType, DexType> rewriteDerivedTypeOnly;
 
@@ -92,10 +88,6 @@
     return rewriteType;
   }
 
-  public Set<DexType> getMaintainType() {
-    return maintainType;
-  }
-
   public Map<DexType, DexType> getRewriteDerivedTypeOnly() {
     return rewriteDerivedTypeOnly;
   }
@@ -182,7 +174,6 @@
     Builder() {}
 
     private final Map<DexType, DexType> rewriteType = new IdentityHashMap<>();
-    private final ImmutableSet.Builder<DexType> maintainType = ImmutableSet.builder();
     private final Map<DexType, DexType> rewriteDerivedTypeOnly = new IdentityHashMap<>();
     private final ImmutableMap.Builder<DexMethod, DexMethod> staticRetarget =
         ImmutableMap.builder();
@@ -210,11 +201,6 @@
       rewriteType.put(src, target);
     }
 
-    public void maintainType(DexType type) {
-      assert type != null;
-      maintainType.add(type);
-    }
-
     public void rewriteDerivedTypeOnly(DexType src, DexType target) {
       rewriteDerivedTypeOnly.put(src, target);
     }
@@ -266,7 +252,6 @@
     public MachineRewritingFlags build() {
       return new MachineRewritingFlags(
           rewriteType,
-          maintainType.build(),
           rewriteDerivedTypeOnly,
           staticRetarget.build(),
           nonEmulatedVirtualRetarget.build(),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
index 78fc59f..87c03e3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineRewritingFlags;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import java.util.Map;
 import java.util.Set;
@@ -26,7 +25,6 @@
   private final String synthesizedPrefix;
   private final boolean libraryCompilation;
   private final Map<DexString, DexString> descriptorPrefix;
-  private final Set<DexString> descriptorMaintainPrefix;
   private final Map<DexString, Map<DexString, DexString>> descriptorDifferentPrefix;
   private final Set<DexString> usedPrefix = Sets.newIdentityHashSet();
 
@@ -40,7 +38,6 @@
     this.synthesizedPrefix = humanSpec.getSynthesizedLibraryClassesPackagePrefix();
     this.libraryCompilation = humanSpec.isLibraryCompilation();
     this.descriptorPrefix = convertRewritePrefix(rewritingFlags.getRewritePrefix());
-    this.descriptorMaintainPrefix = convertMaintainPrefix(rewritingFlags.getMaintainPrefix());
     this.descriptorDifferentPrefix =
         convertRewriteDifferentPrefix(rewritingFlags.getRewriteDerivedPrefix());
   }
@@ -59,7 +56,6 @@
   private void warnIfUnusedPrefix(BiConsumer<String, Set<DexString>> warnConsumer) {
     Set<DexString> prefixes = Sets.newIdentityHashSet();
     prefixes.addAll(descriptorPrefix.keySet());
-    prefixes.addAll(descriptorMaintainPrefix);
     prefixes.addAll(descriptorDifferentPrefix.keySet());
     prefixes.removeAll(usedPrefix);
     warnConsumer.accept("The following prefixes do not match any type: ", prefixes);
@@ -103,7 +99,6 @@
 
   private void registerClassType(DexType type) {
     registerType(type);
-    registerMaintainType(type);
     registerDifferentType(type);
   }
 
@@ -114,15 +109,6 @@
     }
   }
 
-  private void registerMaintainType(DexType type) {
-    DexString prefix = prefixMatching(type, descriptorMaintainPrefix);
-    if (prefix == null) {
-      return;
-    }
-    builder.maintainType(type);
-    usedPrefix.add(prefix);
-  }
-
   private void registerDifferentType(DexType type) {
     DexString prefix = prefixMatching(type, descriptorDifferentPrefix.keySet());
     if (prefix == null) {
@@ -174,14 +160,6 @@
     return mapBuilder.build();
   }
 
-  private ImmutableSet<DexString> convertMaintainPrefix(Set<String> maintainPrefix) {
-    ImmutableSet.Builder<DexString> builder = ImmutableSet.builder();
-    for (String prefix : maintainPrefix) {
-      builder.add(toDescriptorPrefix(prefix));
-    }
-    return builder.build();
-  }
-
   private ImmutableMap<DexString, DexString> convertRewritePrefix(
       Map<String, String> rewritePrefix) {
     ImmutableMap.Builder<DexString, DexString> mapBuilder = ImmutableMap.builder();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
index 3919202..dc739bb 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
@@ -98,13 +98,6 @@
     if (isEmulatedInterface(clazz.type)) {
       return true;
     }
-    if (appView
-        .options()
-        .machineDesugaredLibrarySpecification
-        .getMaintainType()
-        .contains(clazz.type)) {
-      return true;
-    }
     return appView.typeRewriter.hasRewrittenType(clazz.type, appView);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index a9a33cb..2ae7d7d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -713,9 +713,7 @@
       DexClass clazz, DexMethod invokedMethod, ProgramMethod context) {
     DexClassAndMethod superTarget =
         appView.appInfoForDesugaring().lookupSuperTarget(invokedMethod, context);
-    if (clazz.isInterface()
-        && helper.isInDesugaredLibrary(clazz)
-        && !helper.isEmulatedInterface(clazz.type)) {
+    if (clazz.isInterface() && appView.typeRewriter.hasRewrittenType(clazz.type, appView)) {
       if (superTarget != null && superTarget.getDefinition().isDefaultMethod()) {
         DexClass holder = superTarget.getHolder();
         if (holder.isLibraryClass() && holder.isInterface()) {
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 d462818..46e77e8 100644
--- a/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.desugar.TypeRewriter;
 import com.android.tools.r8.utils.InternalOptions;
+import com.google.common.collect.Sets;
 import java.util.ArrayList;
 import java.util.IdentityHashMap;
 import java.util.List;
@@ -21,24 +22,25 @@
 public class L8TreePruner {
 
   private final InternalOptions options;
+  private final Set<DexType> emulatedInterfaces = Sets.newIdentityHashSet();
+  private final Set<DexType> backports = Sets.newIdentityHashSet();
   private final List<DexType> pruned = new ArrayList<>();
 
   public L8TreePruner(InternalOptions options) {
     this.options = options;
+    backports.addAll(options.machineDesugaredLibrarySpecification.getLegacyBackport().keySet());
+    emulatedInterfaces.addAll(
+        options.machineDesugaredLibrarySpecification.getEmulatedInterfaces().keySet());
   }
 
   public DexApplication prune(DexApplication app, TypeRewriter typeRewriter) {
-    Set<DexType> maintainType = options.machineDesugaredLibrarySpecification.getMaintainType();
-    Set<DexType> emulatedInterfaces =
-        options.machineDesugaredLibrarySpecification.getEmulatedInterfaces().keySet();
     Map<DexType, DexProgramClass> typeMap = new IdentityHashMap<>();
     List<DexProgramClass> toKeep = new ArrayList<>();
     boolean pruneNestMember = false;
     for (DexProgramClass aClass : app.classes()) {
       typeMap.put(aClass.type, aClass);
       if (typeRewriter.hasRewrittenType(aClass.type, null)
-          || emulatedInterfaces.contains(aClass.type)
-          || maintainType.contains(aClass.type)) {
+          || emulatedInterfaces.contains(aClass.type)) {
         toKeep.add(aClass);
       } else {
         pruneNestMember |= aClass.isInANest();
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 133f721..50c315a 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -274,7 +274,6 @@
 
   // Flag to toggle if the prefix based merge restriction should be enforced.
   public boolean enableNeverMergePrefixes = true;
-  // TODO(b/227277105): Control merging with desugared library and maintain prefix.
   public Set<String> neverMergePrefixes = ImmutableSet.of("j$.");
 
   public boolean classpathInterfacesMayHaveStaticInitialization = false;
@@ -938,10 +937,6 @@
     }
     timing.begin("Load machine specification");
     loadMachineDesugaredLibrarySpecification.accept(timing, app);
-    if (!machineDesugaredLibrarySpecification.getMaintainType().isEmpty()) {
-      // TODO(b/227277105): Control merging with desugared library and maintain prefix.
-      neverMergePrefixes = ImmutableSet.of();
-    }
     timing.end();
   }
 
diff --git a/src/test/java/com/android/tools/r8/L8TestBuilder.java b/src/test/java/com/android/tools/r8/L8TestBuilder.java
index 2ff60ba..7a42ab1 100644
--- a/src/test/java/com/android/tools/r8/L8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/L8TestBuilder.java
@@ -184,10 +184,7 @@
         .inspect(
             inspector ->
                 inspector.forAllClasses(
-                    clazz ->
-                        assertTrue(
-                            clazz.getFinalName().startsWith("j$.")
-                                || clazz.getFinalName().startsWith("java."))));
+                    clazz -> assertTrue(clazz.getFinalName().startsWith("j$."))));
   }
 
   private Collection<Path> getProgramFiles() {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
index 93ea904..f79b585 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
@@ -51,7 +51,13 @@
   }
 
   private String expectedOutput() {
-    return StringUtils.lines("Hello", "Larry", "Page", "Caught java.io.UncheckedIOException");
+    return StringUtils.lines(
+        "Hello",
+        "Larry",
+        "Page",
+        parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N)
+            ? "Caught java.io.UncheckedIOException"
+            : "Caught j$.io.UncheckedIOException");
   }
 
   DesugaredLibrarySpecification configurationAlternative3(
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java
index 4f15b2d..3e83719 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java
@@ -4,6 +4,8 @@
 package com.android.tools.r8.ir.analysis.type;
 
 import static com.android.tools.r8.ir.analysis.type.ClassTypeElement.computeLeastUpperBoundOfInterfaces;
+import static com.android.tools.r8.ir.analysis.type.Nullability.definitelyNotNull;
+import static com.android.tools.r8.ir.analysis.type.Nullability.maybeNull;
 import static com.android.tools.r8.ir.analysis.type.TypeElement.fromDexType;
 import static com.android.tools.r8.ir.analysis.type.TypeElement.getBottom;
 import static com.android.tools.r8.ir.analysis.type.TypeElement.getTop;
@@ -88,10 +90,25 @@
     return TypeElement.fromDexType(type, nullability, appView);
   }
 
+  private ClassTypeElement element(DexType type, Nullability nullability, DexType... interfaces) {
+    assert type.isClassType();
+    InterfaceCollection.Builder interfaceCollectionBuilder = InterfaceCollection.builder();
+    Arrays.asList(interfaces).forEach(interfaceCollectionBuilder::addKnownInterface);
+    return ClassTypeElement.create(type, nullability, appView, interfaceCollectionBuilder.build());
+  }
+
   private ArrayTypeElement array(int nesting, DexType base) {
     return (ArrayTypeElement) element(factory.createArrayType(nesting, base));
   }
 
+  private ArrayTypeElement array(TypeElement baseType) {
+    return array(baseType, maybeNull());
+  }
+
+  private ArrayTypeElement array(TypeElement baseType, Nullability nullability) {
+    return ArrayTypeElement.create(baseType, nullability);
+  }
+
   private TypeElement join(TypeElement... elements) {
     assertTrue(elements.length > 1);
     return TypeElement.join(Arrays.asList(elements), appView);
@@ -374,63 +391,59 @@
   @Test
   public void joinDistinctTypesPrimitiveArrays() {
     assertEquals(
-        array(2, factory.objectType),
-        join(
-            array(3, factory.intType),
-            array(3, factory.floatType)));
+        array(
+            array(
+                element(
+                    factory.objectType,
+                    definitelyNotNull(),
+                    factory.cloneableType,
+                    factory.serializableType))),
+        join(array(3, factory.intType), array(3, factory.floatType)));
   }
 
   @Test
   public void joinDistinctTypesNestingOnePrimitiveArrays() {
     assertEquals(
-        element(factory.objectType),
-        join(
-            array(1, factory.intType),
-            array(1, factory.floatType)));
+        element(factory.objectType, maybeNull(), factory.cloneableType, factory.serializableType),
+        join(array(1, factory.intType), array(1, factory.floatType)));
     assertEquals(
-        element(factory.objectType),
-        join(
-            array(1, factory.longType),
-            array(1, factory.intType)));
+        element(factory.objectType, maybeNull(), factory.cloneableType, factory.serializableType),
+        join(array(1, factory.longType), array(1, factory.intType)));
 
     // Test primitive types smaller than int.
     assertEquals(
-        element(factory.objectType),
-        join(
-            array(1, factory.intType),
-            array(1, factory.byteType)));
+        element(factory.objectType, maybeNull(), factory.cloneableType, factory.serializableType),
+        join(array(1, factory.intType), array(1, factory.byteType)));
     assertEquals(
-        element(factory.objectType),
-        join(
-            array(1, factory.charType),
-            array(1, factory.shortType)));
+        element(factory.objectType, maybeNull(), factory.cloneableType, factory.serializableType),
+        join(array(1, factory.charType), array(1, factory.shortType)));
   }
 
   @Test
   public void joinDistinctTypesNestingOneRightPrimitiveArrays() {
     assertEquals(
-        element(factory.objectType),
-        join(
-            array(5, factory.intType),
-            array(1, factory.floatType)));
+        element(factory.objectType, maybeNull(), factory.cloneableType, factory.serializableType),
+        join(array(5, factory.intType), array(1, factory.floatType)));
   }
 
   @Test
   public void joinDistinctTypesNestingOneLeftPrimitiveArrays() {
     assertEquals(
-        element(factory.objectType),
-        join(
-            array(1, factory.intType),
-            array(5, factory.floatType)));
+        element(factory.objectType, maybeNull(), factory.cloneableType, factory.serializableType),
+        join(array(1, factory.intType), array(5, factory.floatType)));
   }
 
   @Test
   public void joinDistinctNestingPrimitiveArrays() {
     assertEquals(
-        array(2, factory.objectType),
-        join(
-            array(3, factory.intType),
-            array(4, factory.intType)));
+        array(
+            array(
+                element(
+                    factory.objectType,
+                    maybeNull(),
+                    factory.cloneableType,
+                    factory.serializableType))),
+        join(array(3, factory.intType), array(4, factory.intType)));
   }
 
   @Test
@@ -519,10 +532,10 @@
     assertTrue(
         lessThanOrEqualUpToNullability(
             element(factory.objectType, Nullability.maybeNull()),
-            element(factory.objectType, Nullability.definitelyNotNull())));
+            element(factory.objectType, definitelyNotNull())));
     assertTrue(
         lessThanOrEqualUpToNullability(
-            element(factory.objectType, Nullability.definitelyNotNull()),
+            element(factory.objectType, definitelyNotNull()),
             element(factory.objectType, Nullability.maybeNull())));
     assertFalse(
         lessThanOrEqualUpToNullability(array(3, factory.stringType), array(4, factory.stringType)));
@@ -535,7 +548,7 @@
   @Test
   public void testSelfOrderWithoutSubtypingInfo() {
     DexType type = factory.createType("Lmy/Type;");
-    TypeElement nonNullType = fromDexType(type, Nullability.definitelyNotNull(), appView);
+    TypeElement nonNullType = fromDexType(type, definitelyNotNull(), appView);
     ReferenceTypeElement nullableType =
         nonNullType.asReferenceType().getOrCreateVariant(Nullability.maybeNull());
     assertTrue(strictlyLessThan(nonNullType, nullableType));
