diff --git a/src/test/java/com/android/tools/r8/D8TestBuilder.java b/src/test/java/com/android/tools/r8/D8TestBuilder.java
index d6732bd..edfb00c 100644
--- a/src/test/java/com/android/tools/r8/D8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/D8TestBuilder.java
@@ -19,12 +19,12 @@
     extends TestCompilerBuilder<
         D8Command, Builder, D8TestCompileResult, D8TestRunResult, D8TestBuilder> {
 
-  private D8TestBuilder(TestState state, Builder builder) {
-    super(state, builder, Backend.DEX);
+  private D8TestBuilder(TestState state, Builder builder, Backend backend) {
+    super(state, builder, backend);
   }
 
-  public static D8TestBuilder create(TestState state) {
-    return new D8TestBuilder(state, D8Command.builder(state.getDiagnosticsHandler()));
+  public static D8TestBuilder create(TestState state, Backend backend) {
+    return new D8TestBuilder(state, D8Command.builder(state.getDiagnosticsHandler()), backend);
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 7c3ddff..7938666 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -134,8 +134,12 @@
     return ExternalR8TestBuilder.create(new TestState(temp), backend, runtime);
   }
 
+  public static D8TestBuilder testForD8(TemporaryFolder temp, Backend backend) {
+    return D8TestBuilder.create(new TestState(temp), backend);
+  }
+
   public static D8TestBuilder testForD8(TemporaryFolder temp) {
-    return D8TestBuilder.create(new TestState(temp));
+    return D8TestBuilder.create(new TestState(temp), Backend.DEX);
   }
 
   public static DXTestBuilder testForDX(TemporaryFolder temp) {
@@ -171,7 +175,11 @@
   }
 
   public D8TestBuilder testForD8() {
-    return testForD8(temp);
+    return testForD8(temp, Backend.DEX);
+  }
+
+  public D8TestBuilder testForD8(Backend backend) {
+    return testForD8(temp, backend);
   }
 
   public DXTestBuilder testForDX() {
diff --git a/src/test/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java b/src/test/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java
index 44f046b..eba971d 100644
--- a/src/test/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java
+++ b/src/test/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java
@@ -50,7 +50,11 @@
 
   @Override
   public void warning(Diagnostic warning) {
-    warnings.add(warning);
+    // When testing D8 with class file output this warning is always emitted. Discard this, as
+    // for tests this is not relevant.
+    if (!warning.equals("Compiling to Java class files with D8 is not officially supported")) {
+      warnings.add(warning);
+    }
   }
 
   @Override
@@ -58,14 +62,17 @@
     errors.add(error);
   }
 
+  @Override
   public List<Diagnostic> getInfos() {
     return infos;
   }
 
+  @Override
   public List<Diagnostic> getWarnings() {
     return warnings;
   }
 
+  @Override
   public List<Diagnostic> getErrors() {
     return errors;
   }
@@ -80,6 +87,7 @@
         messages.size());
   }
 
+  @Override
   public TestDiagnosticMessages assertNoMessages() {
     assertEmpty("info", getInfos());
     assertEmpty("warning", getWarnings());
@@ -87,6 +95,7 @@
     return this;
   }
 
+  @Override
   public TestDiagnosticMessages assertOnlyInfos() {
     assertNotEquals(0, getInfos().size());
     assertEmpty("warning", getWarnings());
@@ -94,6 +103,7 @@
     return this;
   }
 
+  @Override
   public TestDiagnosticMessages assertOnlyWarnings() {
     assertEmpty("info", getInfos());
     assertNotEquals(0, getWarnings().size());
@@ -101,6 +111,7 @@
     return this;
   }
 
+  @Override
   public TestDiagnosticMessages assertOnlyErrors() {
     assertEmpty("info", getInfos());
     assertEmpty("warning", getWarnings());
@@ -108,16 +119,19 @@
     return this;
   }
 
+  @Override
   public TestDiagnosticMessages assertInfosCount(int count) {
     assertEquals(count, getInfos().size());
     return this;
   }
 
+  @Override
   public TestDiagnosticMessages assertWarningsCount(int count) {
     assertEquals(count, getWarnings().size());
     return this;
   }
 
+  @Override
   public TestDiagnosticMessages assertErrorsCount(int count) {
     assertEquals(count, getErrors().size());
     return this;
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugarToClassFile.java b/src/test/java/com/android/tools/r8/desugar/DesugarToClassFile.java
index ec742ee..e8ac332 100644
--- a/src/test/java/com/android/tools/r8/desugar/DesugarToClassFile.java
+++ b/src/test/java/com/android/tools/r8/desugar/DesugarToClassFile.java
@@ -4,16 +4,11 @@
 
 package com.android.tools.r8.desugar;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestDiagnosticMessages;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.nio.file.Path;
 import org.junit.Test;
@@ -23,45 +18,43 @@
 @RunWith(Parameterized.class)
 public class DesugarToClassFile extends TestBase {
 
-  private final TestParameters parameters;
-
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {
     return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
   }
 
+  private final TestParameters parameters;
+
   public DesugarToClassFile(TestParameters parameters) {
     this.parameters = parameters;
   }
 
-  private void checkSomething(CodeInspector inspector) {
-    ClassSubject classSubject = inspector.clazz(TestClass.class);
-    assertThat(classSubject, isPresent());
+  private void checkHasCompanionClass(CodeInspector inspector) {
+    assertTrue(
+        inspector.allClasses().stream()
+            .anyMatch(subject -> subject.getOriginalName().endsWith("$-CC")));
   }
 
-  private void checkDiagnostics(TestDiagnosticMessages messages) {
-    messages.assertOnlyWarnings();
-    messages.assertWarningsCount(1);
-    assertThat(
-        messages.getWarnings().get(0).getDiagnosticMessage(),
-        containsString("not officially supported"));
+  private void checkHasLambdaClass(CodeInspector inspector) {
+    assertTrue(
+        inspector.allClasses().stream()
+            .anyMatch(subject -> subject.getOriginalName().contains("-$$Lambda$")));
   }
 
   @Test
   public void test() throws Exception {
     // Use D8 to desugar with Java classfile output.
     Path jar =
-        testForD8()
+        testForD8(Backend.CF)
             .addInnerClasses(DesugarToClassFile.class)
             .setMinApi(parameters.getApiLevel())
-            .setOutputMode(OutputMode.ClassFile)
             .compile()
-            .inspectDiagnosticMessages(this::checkDiagnostics)
-            .inspect(this::checkSomething)
+            .inspect(this::checkHasCompanionClass)
+            .inspect(this::checkHasLambdaClass)
             .writeToZip();
 
     if (parameters.getRuntime().isCf()) {
-      // Run on the JVM
+      // Run on the JVM.
       testForJvm()
           .addProgramFiles(jar)
           .run(parameters.getRuntime(), TestClass.class)
@@ -71,8 +64,8 @@
       // Convert to DEX without desugaring.
       testForD8()
           .addProgramFiles(jar)
-          .setEnableDesugaring(false)
           .setMinApi(parameters.getApiLevel())
+          .setEnableDesugaring(false)
           .run(parameters.getRuntime(), TestClass.class)
           .assertSuccessWithOutputLines("Hello, world!", "I::foo");
     }
