diff --git a/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
index 04b702a..3e665db 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
@@ -126,7 +126,7 @@
         ClassInfo parent,
         ImmutableList<DexClassAndMethod> forwardedMethodTargets,
         EmulatedInterfaceInfo emulatedInterfaceInfo) {
-      return forwardedMethodTargets.isEmpty()
+      return forwardedMethodTargets.isEmpty() && emulatedInterfaceInfo.isEmpty()
           ? parent
           : new ClassInfo(parent, forwardedMethodTargets, emulatedInterfaceInfo);
     }
@@ -725,8 +725,8 @@
     SignaturesInfo signatures = visitLibraryClassInfo(clazz.superType);
     // The class may inherit emulated interface info from its program superclass if the latter
     // did not require to resolve the forwarding methods for emualted interfaces.
-    signatures = signatures.withEmulatedInterfaceInfo(superInfo.emulatedInterfaceInfo);
     assert superInfo.isEmpty() || signatures.isEmpty();
+    signatures = signatures.withEmulatedInterfaceInfo(superInfo.emulatedInterfaceInfo);
     for (DexType iface : clazz.interfaces.values) {
       signatures = signatures.merge(visitInterfaceInfo(iface, thisContext));
     }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java
index 9984eb3..57d8867 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java
@@ -24,10 +24,13 @@
 @RunWith(Parameterized.class)
 public class CustomMapHierarchyTest extends DesugaredLibraryTestBase {
 
+  private static final String EXPECTED =
+      StringUtils.lines("B::getOrDefault", "default 1", "B::getOrDefault", "default 2");
+
   private final TestParameters parameters;
   private final boolean shrinkDesugaredLibrary;
 
-  @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}")
+  @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}")
   public static List<Object[]> data() {
     return buildParameters(
         getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(),
@@ -67,13 +70,7 @@
             keepRuleConsumer.get(),
             shrinkDesugaredLibrary)
         .run(parameters.getRuntime(), Main.class)
-        // TODO(b/182381011): Should always be EXPECTED.
-        .assertSuccessWithOutput(
-            parameters
-                    .getApiLevel()
-                    .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
-                ? EXPECTED
-                : NOT_EXPECTED);
+        .assertSuccessWithOutput(EXPECTED);
   }
 
   @Test
@@ -109,25 +106,13 @@
               desugaredLibraryKeepRules,
               shrinkDesugaredLibrary)
           .run(parameters.getRuntime(), Main.class)
-          // TODO(b/182381011): Should always be EXPECTED.
-          .assertSuccessWithOutput(
-              parameters
-                      .getApiLevel()
-                      .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
-                  ? EXPECTED
-                  : NOT_EXPECTED);
+          .assertSuccessWithOutput(EXPECTED);
     } else {
       testForJvm()
           .addProgramFiles(jar)
           .addRunClasspathFiles(getDesugaredLibraryInCF(parameters, options -> {}))
           .run(parameters.getRuntime(), Main.class)
-          // TODO(b/182381011): Should always be EXPECTED.
-          .assertSuccessWithOutput(
-              parameters
-                      .getApiLevel()
-                      .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
-                  ? EXPECTED
-                  : NOT_EXPECTED);
+          .assertSuccessWithOutput(EXPECTED);
     }
   }
 
@@ -145,12 +130,6 @@
             ProguardKeepAttributes.ENCLOSING_METHOD)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
-        // TODO(b/182381011): Should not happen.
-        .applyIf(
-            parameters
-                .getApiLevel()
-                .isLessThan(TestBase.apiLevelWithDefaultInterfaceMethodsSupport()),
-            b -> b.addDontWarn("java.util.Map$-CC"))
         .compile()
         .addDesugaredCoreLibraryRunClassPath(
             this::buildDesugaredLibrary,
@@ -158,19 +137,9 @@
             keepRuleConsumer.get(),
             shrinkDesugaredLibrary)
         .run(parameters.getRuntime(), Main.class)
-        // TODO(b/182381011): Should always be EXPECTED.
-        .assertSuccessWithOutput(
-            parameters
-                    .getApiLevel()
-                    .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
-                ? EXPECTED
-                : NOT_EXPECTED);
+        .assertSuccessWithOutput(EXPECTED);
   }
 
-  final String EXPECTED =
-      StringUtils.lines("B::getOrDefault", "default 1", "B::getOrDefault", "default 2");
-  final String NOT_EXPECTED = StringUtils.lines("B::getOrDefault", "default 1", "default 2");
-
   public static class Main {
     public static void main(String[] args) {
       System.out.println(new B<String>().getOrDefault("Not found", "default 1"));
