diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 87c976d..be491f4 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -76,7 +76,6 @@
 import com.android.tools.r8.ir.optimize.string.StringOptimizer;
 import com.android.tools.r8.ir.regalloc.LinearScanRegisterAllocator;
 import com.android.tools.r8.ir.regalloc.RegisterAllocator;
-import com.android.tools.r8.kotlin.KotlinInfo;
 import com.android.tools.r8.logging.Log;
 import com.android.tools.r8.naming.IdentifierNameStringMarker;
 import com.android.tools.r8.origin.Origin;
@@ -1359,30 +1358,6 @@
       }
     }
     if (paramsCheckedForNull.length() > 0) {
-      // Check if collected information conforms to non-null parameter hints in Kotlin metadata.
-      // These hints are on the original holder. To find the original holder, we first find the
-      // original method signature (this could have changed as a result of, for example, class
-      // merging). Then, we find the type that now corresponds to the the original holder.
-      DexMethod originalSignature = appView.graphLense().getOriginalMethodSignature(method.method);
-      DexClass originalHolder =
-          appView.definitionFor(appView.graphLense().lookupType(originalSignature.holder));
-      if (originalHolder.hasKotlinInfo()) {
-        KotlinInfo kotlinInfo = originalHolder.getKotlinInfo();
-        if (kotlinInfo.hasNonNullParameterHints()) {
-          BitSet hintFromMetadata =
-              kotlinInfo.lookupNonNullParameterHint(
-                  originalSignature.name.toString(), originalSignature.proto.toDescriptorString());
-          if (hintFromMetadata != null && hintFromMetadata.length() > 0) {
-            if (!paramsCheckedForNull.equals(hintFromMetadata) && Log.ENABLED) {
-              Log.debug(getClass(), "Mismatching non-null param hints for %s: %s v.s. %s\n%s",
-                  paramsCheckedForNull.toString(),
-                  hintFromMetadata.toString(),
-                  method.toSourceString(),
-                  logCode(options, method));
-            }
-          }
-        }
-      }
       feedback.setNonNullParamOrThrow(method, paramsCheckedForNull);
     }
   }
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 4f79660..e25e05d 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
@@ -4,8 +4,6 @@
 
 package com.android.tools.r8.kotlin;
 
-import static kotlinx.metadata.Flag.Property.IS_VAR;
-
 import com.android.tools.r8.graph.DexClass;
 import kotlinx.metadata.KmClassVisitor;
 import kotlinx.metadata.KmConstructorVisitor;
@@ -29,26 +27,24 @@
   @Override
   void processMetadata(KotlinClassMetadata.Class metadata) {
     // To avoid lazy parsing/verifying metadata.
+    // TODO(jsjeon): once migration is complete, use #toKmClass and store a mutable model.
     metadata.accept(new ClassVisitorForNonNullParameterHints());
   }
 
-  private class ClassVisitorForNonNullParameterHints extends KmClassVisitor {
+  private static class ClassVisitorForNonNullParameterHints extends KmClassVisitor {
     @Override
     public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
-      return new NonNullParameterHintCollector.FunctionVisitor(nonNullparamHints);
+      return null;
     }
 
     @Override
     public KmConstructorVisitor visitConstructor(int ctorFlags) {
-      return new NonNullParameterHintCollector.ConstructorVisitor(nonNullparamHints, clazz);
+      return null;
     }
 
     @Override
     public KmPropertyVisitor visitProperty(
         int propertyFlags, String name, int getterFlags, int setterFlags) {
-      if (IS_VAR.invoke(propertyFlags)) {
-        return new NonNullParameterHintCollector.PropertyVisitor(nonNullparamHints);
-      }
       return null;
     }
   }
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 225e63a..633788f 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
@@ -4,8 +4,6 @@
 
 package com.android.tools.r8.kotlin;
 
-import static kotlinx.metadata.Flag.Property.IS_VAR;
-
 import kotlinx.metadata.KmFunctionVisitor;
 import kotlinx.metadata.KmPackageVisitor;
 import kotlinx.metadata.KmPropertyVisitor;
@@ -27,21 +25,19 @@
   @Override
   void processMetadata(KotlinClassMetadata.MultiFileClassPart metadata) {
     // To avoid lazy parsing/verifying metadata.
+    // TODO(jsjeon): once migration is complete, use #toKmPackage and store a mutable model.
     metadata.accept(new PackageVisitorForNonNullParameterHints());
   }
 
-  private class PackageVisitorForNonNullParameterHints extends KmPackageVisitor {
+  private static class PackageVisitorForNonNullParameterHints extends KmPackageVisitor {
     @Override
     public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
-      return new NonNullParameterHintCollector.FunctionVisitor(nonNullparamHints);
+      return null;
     }
 
     @Override
     public KmPropertyVisitor visitProperty(
         int propertyFlags, String name, int getterFlags, int setterFlags) {
-      if (IS_VAR.invoke(propertyFlags)) {
-        return new NonNullParameterHintCollector.PropertyVisitor(nonNullparamHints);
-      }
       return null;
     }
   }
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 2f9477e..2b4c326 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
@@ -4,8 +4,6 @@
 
 package com.android.tools.r8.kotlin;
 
-import static kotlinx.metadata.Flag.Property.IS_VAR;
-
 import kotlinx.metadata.KmFunctionVisitor;
 import kotlinx.metadata.KmPackageVisitor;
 import kotlinx.metadata.KmPropertyVisitor;
@@ -27,21 +25,19 @@
   @Override
   void processMetadata(KotlinClassMetadata.FileFacade metadata) {
     // To avoid lazy parsing/verifying metadata.
+    // TODO(jsjeon): once migration is complete, use #toKmPackage and store a mutable model.
     metadata.accept(new PackageVisitorForNonNullParameterHints());
   }
 
-  private class PackageVisitorForNonNullParameterHints extends KmPackageVisitor {
+  private static class PackageVisitorForNonNullParameterHints extends KmPackageVisitor {
     @Override
     public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
-      return new NonNullParameterHintCollector.FunctionVisitor(nonNullparamHints);
+      return null;
     }
 
     @Override
     public KmPropertyVisitor visitProperty(
         int propertyFlags, String name, int getterFlags, int setterFlags) {
-      if (IS_VAR.invoke(propertyFlags)) {
-        return new NonNullParameterHintCollector.PropertyVisitor(nonNullparamHints);
-      }
       return null;
     }
   }
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 ef90173..9d7be0e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
@@ -5,18 +5,12 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.graph.DexClass;
-import com.google.common.collect.HashBasedTable;
-import java.util.BitSet;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 
 // Provides access to kotlin information.
 public abstract class KotlinInfo<MetadataKind extends KotlinClassMetadata> {
   MetadataKind metadata;
   DexClass clazz;
-  final HashBasedTable<String, String, BitSet> nonNullparamHints = HashBasedTable.create();
-
-  KotlinInfo() {
-  }
 
   KotlinInfo(MetadataKind metadata) {
     this(metadata, null);
@@ -76,12 +70,4 @@
   public KotlinClassFacade asClassFacade() {
     return null;
   }
-
-  public boolean hasNonNullParameterHints() {
-    return !nonNullparamHints.isEmpty();
-  }
-
-  public BitSet lookupNonNullParameterHint(String name, String descriptor) {
-    return nonNullparamHints.get(name, descriptor);
-  }
 }
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 fc11f8c..12823c5 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
@@ -41,14 +41,15 @@
   void processMetadata(KotlinClassMetadata.SyntheticClass metadata) {
     if (metadata.isLambda()) {
       // To avoid lazy parsing/verifying metadata.
+      // TODO(jsjeon): once migration is complete, use #toKmLambda and store a mutable model.
       metadata.accept(new LambdaVisitorForNonNullParameterHints());
     }
   }
 
-  private class LambdaVisitorForNonNullParameterHints extends KmLambdaVisitor {
+  private static class LambdaVisitorForNonNullParameterHints extends KmLambdaVisitor {
     @Override
     public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
-      return new NonNullParameterHintCollector.FunctionVisitor(nonNullparamHints);
+      return null;
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java b/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java
deleted file mode 100644
index 0fee156..0000000
--- a/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright (c) 2018, 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.kotlin;
-
-import static kotlinx.metadata.Flag.Type.IS_NULLABLE;
-
-import com.android.tools.r8.graph.DexClass;
-import com.google.common.collect.HashBasedTable;
-import java.util.BitSet;
-import kotlinx.metadata.KmConstructorExtensionVisitor;
-import kotlinx.metadata.KmConstructorVisitor;
-import kotlinx.metadata.KmExtensionType;
-import kotlinx.metadata.KmFunctionExtensionVisitor;
-import kotlinx.metadata.KmFunctionVisitor;
-import kotlinx.metadata.KmPropertyExtensionVisitor;
-import kotlinx.metadata.KmPropertyVisitor;
-import kotlinx.metadata.KmTypeVisitor;
-import kotlinx.metadata.KmValueParameterVisitor;
-import kotlinx.metadata.jvm.JvmConstructorExtensionVisitor;
-import kotlinx.metadata.jvm.JvmFieldSignature;
-import kotlinx.metadata.jvm.JvmFunctionExtensionVisitor;
-import kotlinx.metadata.jvm.JvmMethodSignature;
-import kotlinx.metadata.jvm.JvmPropertyExtensionVisitor;
-
-class NonNullParameterHintCollector {
-
-  static class FunctionVisitor extends KmFunctionVisitor {
-
-    private final HashBasedTable<String, String, BitSet> paramHints;
-
-    private BitSet paramHint = new BitSet();
-    private int paramIndex = 0;
-    private String name = "";
-    private String descriptor = "";
-
-    FunctionVisitor(HashBasedTable<String, String, BitSet> paramHints) {
-      this.paramHints = paramHints;
-    }
-
-    @Override
-    public KmTypeVisitor visitReceiverParameterType(int typeFlags) {
-      if (!IS_NULLABLE.invoke(typeFlags)) {
-        paramHint.set(paramIndex);
-      }
-      paramIndex++;
-      return null;
-    }
-
-    @Override
-    public KmValueParameterVisitor visitValueParameter(int paramFlags, String paramName) {
-      return new KmValueParameterVisitor() {
-        @Override
-        public KmTypeVisitor visitType(int typeFlags) {
-          if (!IS_NULLABLE.invoke(typeFlags)) {
-            paramHint.set(paramIndex);
-          }
-          paramIndex++;
-          return null;
-        }
-      };
-    }
-
-    @Override
-    public KmFunctionExtensionVisitor visitExtensions(KmExtensionType type) {
-      if (type != JvmFunctionExtensionVisitor.TYPE) {
-        return null;
-      }
-      return new JvmFunctionExtensionVisitor() {
-        @Override
-        public void visit(JvmMethodSignature desc) {
-          if (desc != null) {
-            name = desc.getName();
-            descriptor = desc.getDesc();
-          }
-        }
-      };
-    }
-
-    @Override
-    public void visitEnd() {
-      if (name.isEmpty() || descriptor.isEmpty()) {
-        return;
-      }
-      paramHints.put(name, descriptor, paramHint);
-    }
-  }
-
-  static class ConstructorVisitor extends KmConstructorVisitor {
-    private final HashBasedTable<String, String, BitSet> paramHints;
-
-    private BitSet paramHint = new BitSet();
-    private int paramIndex = 0;
-    private final String name = "<init>";
-    private String descriptor = "";
-
-    ConstructorVisitor(HashBasedTable<String, String, BitSet> paramHints, DexClass clazz) {
-      this.paramHints = paramHints;
-      // Enum constructor has two synthetic arguments to java.lang.Enum's sole constructor:
-      // https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html#Enum-java.lang.String-int-
-      // whereas Kotlin @Metadata is still based on constructor signature, not descriptor.
-      if (clazz != null && clazz.isEnum()) {
-        // name - The name of this enum constant, which is the identifier used to declare it.
-        paramIndex++;
-        // ordinal - The ordinal of this enumeration constant (its position in the enum declaration,
-        // where the initial constant is assigned an ordinal of zero).
-        paramIndex++;
-      }
-    }
-
-    @Override
-    public KmValueParameterVisitor visitValueParameter(int paramFlags, String paramName) {
-      return new KmValueParameterVisitor() {
-        @Override
-        public KmTypeVisitor visitType(int typeFlags) {
-          if (!IS_NULLABLE.invoke(typeFlags)) {
-            paramHint.set(paramIndex);
-          }
-          paramIndex++;
-          return null;
-        }
-      };
-    }
-
-    @Override
-    public KmConstructorExtensionVisitor visitExtensions(KmExtensionType type) {
-      if (type != JvmConstructorExtensionVisitor.TYPE) {
-        return null;
-      }
-      return new JvmConstructorExtensionVisitor() {
-        @Override
-        public void visit(JvmMethodSignature desc) {
-          descriptor = desc.getDesc();
-        }
-      };
-    }
-
-    @Override
-    public void visitEnd() {
-      if (descriptor.isEmpty()) {
-        return;
-      }
-      paramHints.put(name, descriptor, paramHint);
-    }
-  }
-
-  static class PropertyVisitor extends KmPropertyVisitor {
-    private final HashBasedTable<String, String, BitSet> paramHints;
-
-    private BitSet paramHint = new BitSet();
-    private int paramIndex = 0;
-    private String name = "";
-    private String descriptor = "";
-
-    PropertyVisitor(HashBasedTable<String, String, BitSet> paramHints) {
-      this.paramHints = paramHints;
-    }
-
-    @Override
-    public KmTypeVisitor visitReturnType(int typeFlags) {
-      if (!IS_NULLABLE.invoke(typeFlags)) {
-        paramHint.set(paramIndex);
-      }
-      paramIndex++;
-      return null;
-    }
-
-    @Override
-    public KmPropertyExtensionVisitor visitExtensions(KmExtensionType type) {
-      if (type != JvmPropertyExtensionVisitor.TYPE) {
-        return null;
-      }
-      return new JvmPropertyExtensionVisitor() {
-        @Override
-        public void visit(
-            JvmFieldSignature fieldDesc,
-            JvmMethodSignature getterDesc,
-            JvmMethodSignature setterDesc) {
-          if (setterDesc != null) {
-            name = setterDesc.getName();
-            descriptor = setterDesc.getDesc();
-          }
-        }
-      };
-    }
-
-    @Override
-    public void visitEnd() {
-      if (name.isEmpty() || descriptor.isEmpty()) {
-        return;
-      }
-      paramHints.put(name, descriptor, paramHint);
-    }
-  }
-}
\ No newline at end of file
