diff --git a/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java b/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
index dccd176..fd51973 100644
--- a/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
@@ -329,6 +329,10 @@
     return className.replace(JAVA_PACKAGE_SEPARATOR, DESCRIPTOR_PACKAGE_SEPARATOR);
   }
 
+  public static String getJavaTypeFromBinaryName(String className) {
+    return className.replace(DESCRIPTOR_PACKAGE_SEPARATOR, JAVA_PACKAGE_SEPARATOR);
+  }
+
   public static String getBinaryNameFromDescriptor(String classDescriptor) {
     assert isClassDescriptor(classDescriptor);
     return classDescriptor.substring(1, classDescriptor.length() - 1);
diff --git a/src/test/java/com/android/tools/r8/dexfilemerger/NonAsciiClassNameChecksumTest.java b/src/test/java/com/android/tools/r8/dexfilemerger/NonAsciiClassNameChecksumTest.java
index 146c94f..8e4700b 100644
--- a/src/test/java/com/android/tools/r8/dexfilemerger/NonAsciiClassNameChecksumTest.java
+++ b/src/test/java/com/android/tools/r8/dexfilemerger/NonAsciiClassNameChecksumTest.java
@@ -11,9 +11,11 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import java.io.IOException;
 import java.nio.file.Path;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -22,7 +24,7 @@
 @RunWith(Parameterized.class)
 public class NonAsciiClassNameChecksumTest extends TestBase {
 
-  static final String EXPECTED = StringUtils.lines("Hello, world");
+  static final String EXPECTED = StringUtils.lines("Hello æ");
 
   private final TestParameters parameters;
 
@@ -35,26 +37,42 @@
     this.parameters = parameters;
   }
 
+  private String getTransformedName(Class<?> clazz) {
+    return getTransformedName(clazz.getTypeName());
+  }
+
+  private String getTransformedName(String typeName) {
+    return NonAsciiClassNameChecksumTest.class.getTypeName()
+        + "$"
+        + (typeName.equals(TestClaass.class.getTypeName()) ? "TestClåss" : "TæstClass");
+  }
+
+  private byte[] getTransform(Class<?> clazz) throws IOException {
+    return transformer(clazz)
+        .setClassDescriptor(DescriptorUtils.javaTypeToDescriptor(getTransformedName(clazz)))
+        .transform();
+  }
+
   @Test
   public void test() throws Exception {
-    Path intermediate1 = compileIntermediate(TæstClass.class);
-    Path intermediate2 = compileIntermediate(TestClåss.class);
+    Path intermediate1 = compileIntermediate(TaestClass.class);
+    Path intermediate2 = compileIntermediate(TestClaass.class);
     testForD8()
         .addProgramFiles(intermediate1, intermediate2)
         .setMinApi(parameters.getApiLevel())
         .setIncludeClassesChecksum(true)
-        .run(parameters.getRuntime(), TæstClass.class)
+        .run(parameters.getRuntime(), getTransformedName(TaestClass.class))
         .assertSuccessWithOutput(EXPECTED)
         .inspect(inspector -> {
-          checkIncludesChecksum(inspector, TæstClass.class);
-          checkIncludesChecksum(inspector, TestClåss.class);
+          checkIncludesChecksum(inspector, TaestClass.class);
+          checkIncludesChecksum(inspector, TestClaass.class);
         });
   }
 
   private Path compileIntermediate(Class<?> clazz) throws Exception {
     return testForD8()
         .setOutputMode(OutputMode.DexFilePerClassFile)
-        .addProgramClasses(clazz)
+        .addProgramClassFileData(getTransform(clazz))
         .setMinApi(parameters.getApiLevel())
         .setIncludeClassesChecksum(true)
         .compile()
@@ -63,20 +81,20 @@
   }
 
   private void checkIncludesChecksum(CodeInspector inspector, Class<?> clazz) {
-    ClassSubject classSubject = inspector.clazz(clazz);
+    ClassSubject classSubject = inspector.clazz(getTransformedName(clazz));
     assertThat(classSubject, isPresent());
     assertTrue(classSubject.getDexClass().asProgramClass().getChecksum() > 0);
   }
 
-  static class TæstClass {
+  static class TaestClass {
     public static void main(String[] args) {
-      new TestClåss().foo();
+      System.out.println("Hello æ");
     }
   }
 
-  static class TestClåss {
-    public void foo() {
-      System.out.println("Hello, world");
+  static class TestClaass {
+    public static void main(String[] args) {
+      System.out.println("Hello å");
     }
   }
 }
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java b/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java
index 3d653d0..598f6f1 100644
--- a/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java
+++ b/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java
@@ -166,6 +166,31 @@
         });
   }
 
+  /** Unconditionally replace the descriptor (ie, qualified name) of a class. */
+  public ClassFileTransformer setClassDescriptor(String descriptor) {
+    assert DescriptorUtils.isClassDescriptor(descriptor);
+    return addClassTransformer(
+        new ClassTransformer() {
+          @Override
+          public void visit(
+              int version,
+              int access,
+              String ignoredName,
+              String signature,
+              String superName,
+              String[] interfaces) {
+            super.visit(
+                version,
+                access,
+                DescriptorUtils.getBinaryNameFromDescriptor(descriptor),
+                signature,
+                superName,
+                interfaces);
+          }
+        });
+  }
+
+
   public ClassFileTransformer setMinVersion(CfVm jdk) {
     return setMinVersion(jdk.getClassfileVersion());
   }
