diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
index 48f29c2..6085350 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
@@ -42,9 +42,7 @@
   }
 
   @Override
-  void processMetadata() {
-    assert !isProcessed;
-    isProcessed = true;
+  void processMetadata(KotlinClassMetadata.Class metadata) {
     kmClass = metadata.toKmClass();
   }
 
@@ -142,4 +140,8 @@
     return this;
   }
 
+  @Override
+  public String toString() {
+    return clazz.toString() + ": " + kmClass.toString();
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java
index fee14fa..4433017 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.StringUtils;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.ListIterator;
@@ -36,9 +37,7 @@
   }
 
   @Override
-  void processMetadata() {
-    assert !isProcessed;
-    isProcessed = true;
+  void processMetadata(KotlinClassMetadata.MultiFileClassFacade metadata) {
     // Part Class names are stored in `d1`, which is immutable. Make a copy instead.
     partClassNames = new ArrayList<>(metadata.getPartClassNames());
     // No API to explore metadata details, hence nothing further to do.
@@ -81,4 +80,9 @@
     return this;
   }
 
+  @Override
+  public String toString() {
+    return clazz.toString()
+        + ": MultiFileClassFacade(" + StringUtils.join(partClassNames, ", ") + ")";
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
index 17a30ef..f108252 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
@@ -35,9 +35,7 @@
   }
 
   @Override
-  void processMetadata() {
-    assert !isProcessed;
-    isProcessed = true;
+  void processMetadata(KotlinClassMetadata.MultiFileClassPart metadata) {
     kmPackage = metadata.toKmPackage();
     facadeClassName = metadata.getFacadeClassName();
   }
@@ -83,4 +81,9 @@
     return this;
   }
 
+  @Override
+  public String toString() {
+    return clazz.toString() + ": " + kmPackage.toString()
+        + ": MultiFileClassPart(" + facadeClassName + ")";
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
index 5eac335..bb4dc47 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
@@ -29,9 +29,7 @@
   }
 
   @Override
-  void processMetadata() {
-    assert !isProcessed;
-    isProcessed = true;
+  void processMetadata(KotlinClassMetadata.FileFacade metadata) {
     kmPackage = metadata.toKmPackage();
   }
 
@@ -65,4 +63,8 @@
     return this;
   }
 
+  @Override
+  public String toString() {
+    return clazz.toString() + ": " + kmPackage.toString();
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
index 56d9359..e9c1eb6 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
@@ -25,19 +25,16 @@
 
 // Provides access to package/class-level Kotlin information.
 public abstract class KotlinInfo<MetadataKind extends KotlinClassMetadata> {
-  final MetadataKind metadata;
   final DexClass clazz;
-  boolean isProcessed;
 
   KotlinInfo(MetadataKind metadata, DexClass clazz) {
     assert clazz != null;
-    this.metadata = metadata;
     this.clazz = clazz;
-    processMetadata();
+    processMetadata(metadata);
   }
 
   // Subtypes will define how to process the given metadata.
-  abstract void processMetadata();
+  abstract void processMetadata(MetadataKind metadata);
 
   // Subtypes will define how to rewrite metadata after shrinking and minification.
   // Subtypes that represent subtypes of {@link KmDeclarationContainer} can use
@@ -96,12 +93,6 @@
     return isClass() || isFile() || isClassPart();
   }
 
-  @Override
-  public String toString() {
-    return (clazz != null ? clazz.toSourceString() : "<null class?!>")
-        + ": " + metadata.toString();
-  }
-
   // {@link KmClass} and {@link KmPackage} are inherited from {@link KmDeclarationContainer} that
   // abstract functions and properties. Rewriting of those portions can be unified here.
   void rewriteDeclarationContainer(
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
index 28a6eb1..5cc7d2e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
@@ -12,6 +12,9 @@
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 
 public final class KotlinSyntheticClass extends KotlinInfo<KotlinClassMetadata.SyntheticClass> {
+  // TODO(b/70169921): Once converted to internal data structure, this can be gone.
+  private KotlinClassMetadata.SyntheticClass metadata;
+
   public enum Flavour {
     KotlinStyleLambda,
     JavaStyleLambda,
@@ -41,9 +44,8 @@
   }
 
   @Override
-  void processMetadata() {
-    assert !isProcessed;
-    isProcessed = true;
+  void processMetadata(KotlinClassMetadata.SyntheticClass metadata) {
+    this.metadata = metadata;
     if (metadata.isLambda()) {
       // TODO(b/70169921): Use #toKmLambda to store a mutable model if needed.
     }
@@ -116,4 +118,8 @@
         && clazz.interfaces.size() == 1;
   }
 
+  @Override
+  public String toString() {
+    return clazz.toString() + ": " + metadata.toString();
+  }
 }
