diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index e722669..2f249a7 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -715,7 +715,7 @@
       AnnotationsDirectory annotationsDirectory = annotationsDirectoryAt(annotationsOffsets[i]);
 
       Long checksum = null;
-      if (checksums != null && classDataOffsets[i] != 0) {
+      if (checksums != null) {
         String desc = type.descriptor.toASCIIString();
         checksum = checksums.getOrDefault(desc, null);
         if (!options.dexClassChecksumFilter.test(desc, checksum)) {
diff --git a/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsClassWithNoMethodsTest.java b/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsClassWithNoMethodsTest.java
new file mode 100644
index 0000000..9161a5d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsClassWithNoMethodsTest.java
@@ -0,0 +1,79 @@
+// Copyright (c) 2019, 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.dexfilemerger;
+
+import static org.objectweb.asm.Opcodes.V1_8;
+
+import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import java.nio.file.Path;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Opcodes;
+
+@RunWith(Parameterized.class)
+public class DexMergeChecksumsClassWithNoMethodsTest extends TestBase {
+
+  private final TestParameters parameters;
+
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withDexRuntimes().withAllApiLevels().build();
+  }
+
+  public DexMergeChecksumsClassWithNoMethodsTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testChecksumForClassWithNoMethods() throws Exception {
+    ClassWriter cw = new ClassWriter(0);
+    cw.visit(
+        V1_8,
+        Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER,
+        this.getClass().getTypeName().replace('.', '/') + "$" + "A",
+        null,
+        "java/lang/Object",
+        null);
+    cw.visitEnd();
+
+    Path dexArchiveA =
+        testForD8()
+            .setMinApi(parameters.getApiLevel())
+            .addProgramClassFileData(cw.toByteArray())
+            .setMode(CompilationMode.DEBUG)
+            .setIncludeClassesChecksum(true)
+            .compile().writeToZip();
+
+    Path dexArchiveTestClass =
+        testForD8()
+            .setMinApi(parameters.getApiLevel())
+            .addProgramClasses(TestClass.class)
+            .setMode(CompilationMode.DEBUG)
+            .setIncludeClassesChecksum(true)
+            .compile()
+            .writeToZip();
+
+    testForD8()
+        .setMinApi(parameters.getApiLevel())
+        .addProgramFiles(dexArchiveA, dexArchiveTestClass)
+        .setIncludeClassesChecksum(true)
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutputLines(this.getClass().getSimpleName() + "$A");
+  }
+
+  class A {}
+
+  static class TestClass {
+
+    public static void main(String[] args) {
+      System.out.println(A.class.getSimpleName());
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsMarkerInterfaceTest.java b/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsMarkerInterfaceTest.java
new file mode 100644
index 0000000..b64ca95
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/dexfilemerger/DexMergeChecksumsMarkerInterfaceTest.java
@@ -0,0 +1,66 @@
+// Copyright (c) 2019, 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.dexfilemerger;
+
+import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import java.nio.file.Path;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class DexMergeChecksumsMarkerInterfaceTest extends TestBase {
+
+  private final TestParameters parameters;
+
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withDexRuntimes().withAllApiLevels().build();
+  }
+
+  public DexMergeChecksumsMarkerInterfaceTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testChecksumForMarkerInterface() throws Exception {
+    Path dexArchiveI =
+        testForD8()
+            .setMinApi(parameters.getApiLevel())
+            .addProgramClasses(I.class)
+            .setMode(CompilationMode.DEBUG)
+            .setIncludeClassesChecksum(true)
+            .compile()
+            .writeToZip();
+
+    Path dexArchiveTestClass =
+        testForD8()
+            .setMinApi(parameters.getApiLevel())
+            .addProgramClasses(TestClass.class)
+            .setMode(CompilationMode.DEBUG)
+            .setIncludeClassesChecksum(true)
+            .compile()
+            .writeToZip();
+
+    testForD8()
+        .setMinApi(parameters.getApiLevel())
+        .addProgramFiles(dexArchiveI, dexArchiveTestClass)
+        .setIncludeClassesChecksum(true)
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutputLines("Hello, world!");
+  }
+
+  interface I {}
+
+  static class TestClass implements I {
+
+    public static void main(String[] args) {
+      System.out.println("Hello, world!");
+    }
+  }
+}
