diff --git a/src/main/java/com/android/tools/r8/tracereferences/Formatter.java b/src/main/java/com/android/tools/r8/tracereferences/Formatter.java
index b572f26..fd188c0 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/Formatter.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/Formatter.java
@@ -76,20 +76,14 @@
   protected abstract void printTypeFooter();
 
   void format(TraceReferencesResult result) {
-    print(
-        result.types,
-        result.keepPackageNames,
-        result.fields,
-        result.methods,
-        result.missingDefinition);
+    print(result.types, result.keepPackageNames, result.fields, result.methods);
   }
 
   private void print(
       Set<TracedClass> types,
       Set<PackageReference> keepPackageNames,
       Map<ClassReference, Set<TracedField>> fields,
-      Map<ClassReference, Set<TracedMethod>> methods,
-      Set<Object> missingDefinition) {
+      Map<ClassReference, Set<TracedMethod>> methods) {
     List<TracedClass> sortedTypes = new ArrayList<>(types);
     sortedTypes.sort(Comparator.comparing(tracedClass -> tracedClass.getReference().getTypeName()));
     for (TracedClass type : sortedTypes) {
@@ -97,7 +91,7 @@
           methods.getOrDefault(type.getReference(), Collections.emptySet());
       Set<TracedField> fieldsForClass =
           fields.getOrDefault(type.getReference(), Collections.emptySet());
-      if (missingDefinition.contains(type.getReference())) {
+      if (type.isMissingDefinition()) {
         continue;
       }
       printTypeHeader(type);
diff --git a/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesResult.java b/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesResult.java
index e40f3d7..e0ce86a 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesResult.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/TraceReferencesResult.java
@@ -16,25 +16,22 @@
 import java.util.Map;
 import java.util.Set;
 
-class TraceReferencesResult {
+public class TraceReferencesResult {
 
   final Set<TracedClass> types;
   final Map<ClassReference, Set<TracedField>> fields;
   final Map<ClassReference, Set<TracedMethod>> methods;
   final Set<PackageReference> keepPackageNames;
-  final Set<Object> missingDefinition;
 
   TraceReferencesResult(
       Set<TracedClass> types,
       Map<ClassReference, Set<TracedField>> fields,
       Map<ClassReference, Set<TracedMethod>> methods,
-      Set<PackageReference> keepPackageNames,
-      Set<Object> missingDefinition) {
+      Set<PackageReference> keepPackageNames) {
     this.types = types;
     this.fields = fields;
     this.methods = methods;
     this.keepPackageNames = keepPackageNames;
-    this.missingDefinition = missingDefinition;
   }
 
   static Builder builder() {
@@ -45,33 +42,23 @@
     private final Set<TracedClass> types = new HashSet<>();
     private final Map<ClassReference, Set<TracedField>> fields = new HashMap<>();
     private final Map<ClassReference, Set<TracedMethod>> methods = new HashMap<>();
-    private final Set<Object> missingDefinition = new HashSet<>();
     private final Set<PackageReference> keepPackageNames = new HashSet<>();
 
     @Override
     public void acceptType(TracedClass tracedClass, DiagnosticsHandler handler) {
       types.add(tracedClass);
-      if (tracedClass.isMissingDefinition()) {
-        this.missingDefinition.add(tracedClass.getReference());
-      }
     }
 
     @Override
     public void acceptField(TracedField tracedField, DiagnosticsHandler handler) {
       FieldReference field = tracedField.getReference();
       fields.computeIfAbsent(field.getHolderClass(), k -> new HashSet<>()).add(tracedField);
-      if (tracedField.isMissingDefinition()) {
-        this.missingDefinition.add(field);
-      }
     }
 
     @Override
     public void acceptMethod(TracedMethod tracedMethod, DiagnosticsHandler handler) {
       MethodReference method = tracedMethod.getReference();
       methods.computeIfAbsent(method.getHolderClass(), k -> new HashSet<>()).add(tracedMethod);
-      if (tracedMethod.isMissingDefinition()) {
-        this.missingDefinition.add(method);
-      }
     }
 
     @Override
@@ -83,13 +70,7 @@
     public void finished(DiagnosticsHandler handler) {}
 
     TraceReferencesResult build() {
-      missingDefinition.forEach(
-          missingDefinition -> {
-            assert missingDefinition instanceof ClassReference
-                || missingDefinition instanceof FieldReference
-                || missingDefinition instanceof MethodReference;
-          });
-      return new TraceReferencesResult(types, fields, methods, keepPackageNames, missingDefinition);
+      return new TraceReferencesResult(types, fields, methods, keepPackageNames);
     }
   }
 }
