diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
index f52f65e..a1ad70f 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.kotlin;
 
+import static com.android.tools.r8.kotlin.KotlinMetadataUtils.INVALID_KOTLIN_INFO;
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.NO_KOTLIN_INFO;
 
 import com.android.tools.r8.graph.DexAnnotation;
@@ -36,6 +37,7 @@
                     + clazz.type.toSourceString()
                     + " has malformed kotlin.Metadata: "
                     + e.getMessage()));
+        return INVALID_KOTLIN_INFO;
       } catch (Throwable e) {
         reporter.info(
             new StringDiagnostic(
@@ -43,6 +45,7 @@
                     + clazz.type.toSourceString()
                     + "'s kotlin.Metadata: "
                     + e.getMessage()));
+        return INVALID_KOTLIN_INFO;
       }
     }
     return NO_KOTLIN_INFO;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
index b3c167f..31818e8 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.kotlin;
 
+import static com.android.tools.r8.kotlin.KotlinMetadataUtils.INVALID_KOTLIN_INFO;
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.NO_KOTLIN_INFO;
 
 import com.android.tools.r8.graph.AppView;
@@ -73,9 +74,12 @@
           KotlinClassLevelInfo kotlinInfo = clazz.getKotlinInfo();
           DexAnnotation oldMeta =
               clazz.annotations().getFirstMatching(kotlin.metadata.kotlinMetadataType);
+          if (kotlinInfo == INVALID_KOTLIN_INFO) {
+            // Maintain invalid kotlin info for classes.
+            return;
+          }
           if (kotlinInfo == NO_KOTLIN_INFO) {
-            // TODO(b/154346948): Track invalid meta-data objects such that we can enable this
-            // assert oldMeta == null;
+            assert oldMeta == null;
             return;
           }
           if (oldMeta != null) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
index fb173a2..e846c14 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
@@ -27,11 +27,23 @@
 
 public class KotlinMetadataUtils {
 
-  public static final NoKotlinInfo NO_KOTLIN_INFO = new NoKotlinInfo();
+  public static final NoKotlinInfo NO_KOTLIN_INFO = new NoKotlinInfo("NO_KOTLIN_INFO");
+  public static final NoKotlinInfo INVALID_KOTLIN_INFO = new NoKotlinInfo("INVALID_KOTLIN_INFO");
 
   private static class NoKotlinInfo
       implements KotlinClassLevelInfo, KotlinFieldLevelInfo, KotlinMethodLevelInfo {
 
+    private final String name;
+
+    private NoKotlinInfo(String name) {
+      this.name = name;
+    }
+
+    @Override
+    public String toString() {
+      return name;
+    }
+
     @Override
     public KotlinClassHeader rewrite(
         DexClass clazz, AppView<AppInfoWithLiveness> appView, NamingLens namingLens) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
index cc11647..af02060 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.Reporter;
-import kotlinx.metadata.InconsistentKotlinMetadataException;
 import kotlinx.metadata.KmLambda;
 import kotlinx.metadata.jvm.KotlinClassHeader;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
@@ -43,12 +42,8 @@
       Reporter reporter) {
     KmLambda lambda = null;
     if (syntheticClass.isLambda()) {
-      try {
-        lambda = syntheticClass.toKmLambda();
-        assert lambda != null;
-      } catch (InconsistentKotlinMetadataException ex) {
-        // TODO(b/155534905): Gracefully handle these errors by retaining the original object.
-      }
+      lambda = syntheticClass.toKmLambda();
+      assert lambda != null;
     }
     return new KotlinSyntheticClassInfo(
         lambda != null
diff --git a/src/test/java/com/android/tools/r8/KotlinTestBase.java b/src/test/java/com/android/tools/r8/KotlinTestBase.java
index 1a6a428..6cd9cfd 100644
--- a/src/test/java/com/android/tools/r8/KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/KotlinTestBase.java
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8;
 
+import static org.hamcrest.CoreMatchers.containsString;
+
 import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.FileUtils;
@@ -12,6 +14,7 @@
 import java.nio.file.Paths;
 import java.util.List;
 import java.util.stream.Collectors;
+import org.hamcrest.Matcher;
 
 public abstract class KotlinTestBase extends TestBase {
 
@@ -66,4 +69,8 @@
   protected Path getMappingfile(String folder, String mappingFileName) {
     return Paths.get(ToolHelper.TESTS_DIR, RSRC, folder, mappingFileName);
   }
+
+  protected static Matcher<String> expectedInfoMessagesFromKotlinStdLib() {
+    return containsString("No VersionRequirement");
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/kotlin/ProcessKotlinStdlibTest.java b/src/test/java/com/android/tools/r8/kotlin/ProcessKotlinStdlibTest.java
index 4c45d3c..e3107bb 100644
--- a/src/test/java/com/android/tools/r8/kotlin/ProcessKotlinStdlibTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/ProcessKotlinStdlibTest.java
@@ -31,12 +31,15 @@
         getTestParameters().withAllRuntimes().build(), KotlinTargetVersion.values());
   }
 
-  private void test(Collection<String> rules) throws Exception {
-    test(rules, null);
+  private void test(Collection<String> rules, boolean expectInvalidFoo) throws Exception {
+    test(rules, expectInvalidFoo, null);
   }
 
   private void test(
-      Collection<String> rules, ThrowableConsumer<R8FullTestBuilder> consumer) throws Exception {
+      Collection<String> rules,
+      boolean expectInvalidDebugInfo,
+      ThrowableConsumer<R8FullTestBuilder> consumer)
+      throws Exception {
     testForR8(parameters.getBackend())
         .addProgramFiles(ToolHelper.getKotlinStdlibJar())
         .addKeepRules(rules)
@@ -44,58 +47,63 @@
         .addKeepAttributes(ProguardKeepAttributes.INNER_CLASSES)
         .addKeepAttributes(ProguardKeepAttributes.ENCLOSING_METHOD)
         .apply(consumer)
-        .compile();
+        .allowDiagnosticInfoMessages(expectInvalidDebugInfo)
+        .compile()
+        .assertAllInfoMessagesMatch(expectedInfoMessagesFromKotlinStdLib());
   }
 
   @Test
   public void testAsIs() throws Exception {
-    test(ImmutableList.of("-dontshrink", "-dontoptimize", "-dontobfuscate"));
+    test(ImmutableList.of("-dontshrink", "-dontoptimize", "-dontobfuscate"), true);
   }
 
   @Test
   public void testDontShrinkAndDontOptimize() throws Exception {
-    test(ImmutableList.of("-dontshrink", "-dontoptimize"));
+    test(ImmutableList.of("-dontshrink", "-dontoptimize"), true);
   }
 
   @Test
   public void testDontShrinkAndDontOptimizeDifferently() throws Exception {
-     test(
-         ImmutableList.of("-keep,allowobfuscation class **.*Exception*"),
-         tb -> {
-           tb.noTreeShaking();
-           tb.addOptionsModification(o -> {
-             // Randomly choose a couple of optimizations.
-             o.enableClassInlining = false;
-             o.enableLambdaMerging = false;
-             o.enableValuePropagation = false;
-           });
-         });
+    test(
+        ImmutableList.of("-keep,allowobfuscation class **.*Exception*"),
+        true,
+        tb -> {
+          tb.noTreeShaking();
+          tb.addOptionsModification(
+              o -> {
+                // Randomly choose a couple of optimizations.
+                o.enableClassInlining = false;
+                o.enableLambdaMerging = false;
+                o.enableValuePropagation = false;
+              });
+        });
   }
 
   @Test
   public void testDontShrinkAndDontObfuscate() throws Exception {
-    test(ImmutableList.of("-dontshrink", "-dontobfuscate"));
+    test(ImmutableList.of("-dontshrink", "-dontobfuscate"), true);
   }
 
   @Test
   public void testDontShrink() throws Exception {
-    test(ImmutableList.of("-dontshrink"));
+    test(ImmutableList.of("-dontshrink"), true);
   }
 
   @Test
   public void testDontShrinkDifferently() throws Exception {
     test(
         ImmutableList.of("-keep,allowobfuscation class **.*Exception*"),
+        true,
         tb -> tb.noTreeShaking());
   }
 
   @Test
   public void testDontOptimize() throws Exception {
-    test(ImmutableList.of("-dontoptimize"));
+    test(ImmutableList.of("-dontoptimize"), false);
   }
 
   @Test
   public void testDontObfuscate() throws Exception {
-    test(ImmutableList.of("-dontobfuscate"));
+    test(ImmutableList.of("-dontobfuscate"), false);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java b/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
index f3feb33..87b5d10 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
@@ -3,13 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.kotlin.metadata;
 
-import static org.hamcrest.CoreMatchers.anyOf;
-import static org.hamcrest.CoreMatchers.containsString;
-
 import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
 import com.android.tools.r8.kotlin.AbstractR8KotlinTestBase;
 import com.android.tools.r8.utils.DescriptorUtils;
-import org.hamcrest.Matcher;
 
 abstract class KotlinMetadataTestBase extends AbstractR8KotlinTestBase {
 
@@ -31,8 +27,4 @@
 
   static final String KT_FUNCTION1 = "Lkotlin/Function1;";
   static final String KT_COMPARABLE = "Lkotlin/Comparable;";
-
-  static Matcher<String> expectedInfoMessagesFromKotlinStdLib() {
-    return anyOf(containsString("Invalid descriptor"), containsString("No VersionRequirement"));
-  }
 }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewritePassThroughTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewritePassThroughTest.java
index 32a0e6b..e0ac745 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewritePassThroughTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewritePassThroughTest.java
@@ -50,12 +50,11 @@
         .addProgramFiles(ToolHelper.getKotlinStdlibJar())
         .setMinApi(parameters.getApiLevel())
         .addKeepAllClassesRule()
-        .addKeepRules("-keep class kotlin.Metadata")
         .addKeepAttributes(ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS)
+        .allowDiagnosticInfoMessages()
         .compile()
-        // TODO(b/155536535): Enable this assert.
-        // .assertAllInfoMessagesMatch(expectedInfoMessagesFromKotlinStdLib())
-        // .assertInfosCount(5)
+        .assertAllInfoMessagesMatch(expectedInfoMessagesFromKotlinStdLib())
+        .assertInfosCount(3)
         .inspect(this::inspect);
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/b134858535/EventPublisherTest.java b/src/test/java/com/android/tools/r8/shaking/b134858535/EventPublisherTest.java
index 29ab0f2..6d0d767 100644
--- a/src/test/java/com/android/tools/r8/shaking/b134858535/EventPublisherTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/b134858535/EventPublisherTest.java
@@ -20,7 +20,6 @@
 
   @Test
   public void testPrivateMethodsInLambdaClass() throws CompilationFailedException {
-    // TODO(b/155534905): Update expectation.
     testForR8(Backend.DEX)
         .addProgramClasses(Main.class, Interface.class)
         .addProgramClassFileData(EventPublisher$bDump.dump())
@@ -28,6 +27,5 @@
         .addKeepMainRule(Main.class)
         .setMinApi(AndroidApiLevel.L)
         .compile();
-    // .assertAllWarningMessagesMatch(containsString("Unrecognized Kotlin lambda"));
   }
 }
