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 e9251be..5275c4d 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
@@ -13,6 +13,8 @@
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.kotlin.KotlinMemberInfo.KotlinFieldInfo;
+import com.android.tools.r8.kotlin.KotlinMemberInfo.KotlinPropertyInfo;
 import com.android.tools.r8.kotlin.KotlinMetadataSynthesizer.KmPropertyGroup;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -169,12 +171,13 @@
     }
     for (DexEncodedField field : fields) {
       if (backingFieldTester.test(field)) {
-        String name = field.getKotlinMemberInfo().propertyName;
+        KotlinFieldInfo kotlinFieldInfo = field.getKotlinMemberInfo().asFieldInfo();
+        assert kotlinFieldInfo != null;
+        String name = kotlinFieldInfo.propertyName;
         assert name != null;
         KmPropertyGroup.Builder builder =
             propertyGroupBuilderMap.computeIfAbsent(
-                name,
-                k -> KmPropertyGroup.builder(field.getKotlinMemberInfo().propertyFlags, name));
+                name, k -> KmPropertyGroup.builder(kotlinFieldInfo.flags, name));
         builder.foundBackingField(field);
       }
     }
@@ -183,26 +186,28 @@
         continue;
       }
       if (method.isKotlinProperty() || method.isKotlinExtensionProperty()) {
-        String name = method.getKotlinMemberInfo().propertyName;
+        assert method.getKotlinMemberInfo().isPropertyInfo();
+        KotlinPropertyInfo kotlinPropertyInfo = method.getKotlinMemberInfo().asPropertyInfo();
+        String name = kotlinPropertyInfo.propertyName;
         assert name != null;
         KmPropertyGroup.Builder builder =
             propertyGroupBuilderMap.computeIfAbsent(
                 name,
                 // Hitting here (creating a property builder) after visiting all fields means that
                 // this property doesn't have a backing field. Don't use members' flags.
-                k -> KmPropertyGroup.builder(method.getKotlinMemberInfo().propertyFlags, name));
-        switch (method.getKotlinMemberInfo().memberKind) {
+                k -> KmPropertyGroup.builder(kotlinPropertyInfo.flags, name));
+        switch (kotlinPropertyInfo.memberKind) {
           case EXTENSION_PROPERTY_GETTER:
             builder.isExtensionGetter();
             // fallthrough;
           case PROPERTY_GETTER:
-            builder.foundGetter(method, method.getKotlinMemberInfo().flags);
+            builder.foundGetter(method, kotlinPropertyInfo.getterFlags);
             break;
           case EXTENSION_PROPERTY_SETTER:
             builder.isExtensionSetter();
             // fallthrough;
           case PROPERTY_SETTER:
-            builder.foundSetter(method, method.getKotlinMemberInfo().flags);
+            builder.foundSetter(method, kotlinPropertyInfo.setterFlags);
             break;
           case EXTENSION_PROPERTY_ANNOTATIONS:
             builder.isExtensionAnnotations();
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMemberInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMemberInfo.java
index dfdb28b..4238d3e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMemberInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMemberInfo.java
@@ -3,6 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.kotlin;
 
+import static com.android.tools.r8.kotlin.KotlinMemberInfo.MemberKind.CONSTRUCTOR;
+import static com.android.tools.r8.kotlin.KotlinMemberInfo.MemberKind.EXTENSION_FUNCTION;
+import static com.android.tools.r8.kotlin.KotlinMemberInfo.MemberKind.EXTENSION_PROPERTY_GETTER;
+import static com.android.tools.r8.kotlin.KotlinMemberInfo.MemberKind.EXTENSION_PROPERTY_SETTER;
+import static com.android.tools.r8.kotlin.KotlinMemberInfo.MemberKind.FUNCTION;
+import static com.android.tools.r8.kotlin.KotlinMemberInfo.MemberKind.PROPERTY_GETTER;
+import static com.android.tools.r8.kotlin.KotlinMemberInfo.MemberKind.PROPERTY_SETTER;
+import static com.android.tools.r8.kotlin.KotlinMetadataJvmExtensionUtils.getJvmMethodSignature;
 import static com.android.tools.r8.kotlin.KotlinMetadataJvmExtensionUtils.toJvmFieldSignature;
 import static com.android.tools.r8.kotlin.KotlinMetadataJvmExtensionUtils.toJvmMethodSignature;
 import static com.android.tools.r8.kotlin.KotlinMetadataSynthesizer.isExtension;
@@ -10,7 +18,6 @@
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.kotlin.KotlinMetadataJvmExtensionUtils.KmFunctionProcessor;
 import com.android.tools.r8.kotlin.KotlinMetadataJvmExtensionUtils.KmPropertyProcessor;
 import com.android.tools.r8.utils.Reporter;
 import com.google.common.collect.ImmutableList;
@@ -18,18 +25,19 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import kotlinx.metadata.KmConstructor;
 import kotlinx.metadata.KmDeclarationContainer;
 import kotlinx.metadata.KmFunction;
 import kotlinx.metadata.KmProperty;
 import kotlinx.metadata.KmValueParameter;
+import kotlinx.metadata.jvm.JvmMethodSignature;
 
 // Provides access to field/method-level Kotlin information.
-public class KotlinMemberInfo {
-  private static final List<KmValueParameter> EMPTY_PARAM = ImmutableList.of();
+public abstract class KotlinMemberInfo {
+
   private static final List<KotlinValueParameterInfo> EMPTY_PARAM_INFO = ImmutableList.of();
 
-  private static final KotlinMemberInfo NO_KOTLIN_MEMBER_INFO =
-      new KotlinMemberInfo(MemberKind.NONE, 0, EMPTY_PARAM);
+  private static final KotlinMemberInfo NO_KOTLIN_MEMBER_INFO = new NoKotlinMemberInfo();
 
   public static KotlinMemberInfo getNoKotlinMemberInfo() {
     return NO_KOTLIN_MEMBER_INFO;
@@ -38,76 +46,180 @@
   public final MemberKind memberKind;
   // Original member flags. May be necessary to keep Kotlin-specific flag, e.g., suspend function.
   final int flags;
-  // TODO(b/151194869): better to split into FunctionInfo v.s. PropertyInfo ?
-  // Original property flags. E.g., for property getter, getter flags are stored to `flags`, while
-  // the property's flags are stored here, in case of properties without a backing field.
-  final int propertyFlags;
-  // Original property name for (extension) property. Otherwise, null.
-  final String propertyName;
-  // Information from original KmValueParameter(s) if available. Otherwise, null.
-  private final List<KotlinValueParameterInfo> valueParameterInfos;
 
-  // Constructor for KmFunction
-  private KotlinMemberInfo(
-      MemberKind memberKind, int flags, List<KmValueParameter> kmValueParameters) {
-    this(memberKind, flags, 0, null, kmValueParameters);
-  }
-
-  // Constructor for a backing field and a getter in KmProperty
-  private KotlinMemberInfo(
-      MemberKind memberKind, int flags, int propertyFlags, String propertyName) {
-    this(memberKind, flags, propertyFlags, propertyName, EMPTY_PARAM);
-  }
-
-  // Constructor for a setter in KmProperty
-  private KotlinMemberInfo(
-      MemberKind memberKind,
-      int flags,
-      int propertyFlags,
-      String propertyName,
-      KmValueParameter kmValueParameter) {
-    this(
-        memberKind,
-        flags,
-        propertyFlags,
-        propertyName,
-        kmValueParameter != null ? ImmutableList.of(kmValueParameter) : EMPTY_PARAM);
-  }
-
-  private KotlinMemberInfo(
-      MemberKind memberKind,
-      int flags,
-      int propertyFlags,
-      String propertyName,
-      List<KmValueParameter> kmValueParameters) {
+  private KotlinMemberInfo(MemberKind memberKind, int flags) {
     this.memberKind = memberKind;
     this.flags = flags;
-    this.propertyFlags = propertyFlags;
-    this.propertyName = propertyName;
-    assert kmValueParameters != null;
-    if (kmValueParameters.isEmpty()) {
-      this.valueParameterInfos = EMPTY_PARAM_INFO;
-    } else {
-      this.valueParameterInfos = new ArrayList<>(kmValueParameters.size());
-      for (KmValueParameter kmValueParameter : kmValueParameters) {
-        valueParameterInfos.add(KotlinValueParameterInfo.fromKmValueParameter(kmValueParameter));
-      }
+  }
+
+  public boolean isFunctionInfo() {
+    return false;
+  }
+
+  public KotlinFunctionInfo asFunctionInfo() {
+    return null;
+  }
+
+  public boolean isFieldInfo() {
+    return false;
+  }
+
+  public KotlinFieldInfo asFieldInfo() {
+    return null;
+  }
+
+  public boolean isPropertyInfo() {
+    return false;
+  }
+
+  public KotlinPropertyInfo asPropertyInfo() {
+    return null;
+  }
+
+  private static class NoKotlinMemberInfo extends KotlinMemberInfo {
+
+    private NoKotlinMemberInfo() {
+      super(MemberKind.NONE, 0);
     }
   }
 
-  KotlinValueParameterInfo getValueParameterInfo(int i) {
-    if (valueParameterInfos.isEmpty()) {
-      return null;
+  public static class KotlinFunctionInfo extends KotlinMemberInfo {
+
+    // Information from original KmValueParameter(s) if available.
+    private final List<KotlinValueParameterInfo> valueParameterInfos;
+
+    private KotlinFunctionInfo(
+        MemberKind memberKind, int flags, List<KotlinValueParameterInfo> valueParameterInfos) {
+      super(memberKind, flags);
+      assert memberKind.isFunction() || memberKind.isConstructor();
+      this.valueParameterInfos = valueParameterInfos;
     }
-    if (i < 0 || i >= valueParameterInfos.size()) {
-      return null;
+
+    KotlinValueParameterInfo getValueParameterInfo(int i) {
+      if (valueParameterInfos.isEmpty()) {
+        return null;
+      }
+      if (i < 0 || i >= valueParameterInfos.size()) {
+        return null;
+      }
+      return valueParameterInfos.get(i);
     }
-    return valueParameterInfos.get(i);
+
+    @Override
+    public boolean isFunctionInfo() {
+      return true;
+    }
+
+    @Override
+    public KotlinFunctionInfo asFunctionInfo() {
+      return this;
+    }
+  }
+
+  public static class KotlinFieldInfo extends KotlinMemberInfo {
+
+    // Original property name for (extension) property. Otherwise, null.
+    final String propertyName;
+
+    private KotlinFieldInfo(MemberKind memberKind, int flags, String propertyName) {
+      super(memberKind, flags);
+      this.propertyName = propertyName;
+    }
+
+    @Override
+    public boolean isFieldInfo() {
+      return true;
+    }
+
+    @Override
+    public KotlinFieldInfo asFieldInfo() {
+      return this;
+    }
+  }
+
+  public static class KotlinPropertyInfo extends KotlinMemberInfo {
+
+    // Original getter flags. E.g., for property getter.
+    final int getterFlags;
+
+    // Original setter flags. E.g., for property setter.
+    final int setterFlags;
+
+    // Original property name for (extension) property. Otherwise, null.
+    final String propertyName;
+
+    // Information from original KmValueParameter if available.
+    final KotlinValueParameterInfo valueParameterInfo;
+
+    private KotlinPropertyInfo(
+        MemberKind memberKind,
+        int flags,
+        int getterFlags,
+        int setterFlags,
+        String propertyName,
+        KotlinValueParameterInfo valueParameterInfo) {
+      super(memberKind, flags);
+      this.getterFlags = getterFlags;
+      this.setterFlags = setterFlags;
+      this.propertyName = propertyName;
+      this.valueParameterInfo = valueParameterInfo;
+    }
+
+    @Override
+    public KotlinPropertyInfo asPropertyInfo() {
+      return this;
+    }
+
+    @Override
+    public boolean isPropertyInfo() {
+      return true;
+    }
+  }
+
+  private static KotlinFunctionInfo createFunctionInfoFromConstructor(KmConstructor kmConstructor) {
+    return createFunctionInfo(
+        CONSTRUCTOR, kmConstructor.getFlags(), kmConstructor.getValueParameters());
+  }
+
+  private static KotlinFunctionInfo createFunctionInfo(
+      MemberKind memberKind, KmFunction kmFunction) {
+    return createFunctionInfo(memberKind, kmFunction.getFlags(), kmFunction.getValueParameters());
+  }
+
+  private static KotlinFunctionInfo createFunctionInfo(
+      MemberKind memberKind, int flags, List<KmValueParameter> valueParameters) {
+    assert memberKind.isFunction() || memberKind.isConstructor();
+    if (valueParameters.isEmpty()) {
+      return new KotlinFunctionInfo(memberKind, flags, EMPTY_PARAM_INFO);
+    }
+    List<KotlinValueParameterInfo> valueParameterInfos = new ArrayList<>(valueParameters.size());
+    for (KmValueParameter kmValueParameter : valueParameters) {
+      valueParameterInfos.add(KotlinValueParameterInfo.fromKmValueParameter(kmValueParameter));
+    }
+    return new KotlinFunctionInfo(memberKind, flags, valueParameterInfos);
+  }
+
+  private static KotlinFieldInfo createFieldInfo(MemberKind memberKind, KmProperty kmProperty) {
+    assert memberKind.isBackingField() || memberKind.isBackingFieldForCompanionObject();
+    return new KotlinFieldInfo(memberKind, kmProperty.getFlags(), kmProperty.getName());
+  }
+
+  private static KotlinPropertyInfo createPropertyInfo(
+      MemberKind memberKind, KmProperty kmProperty) {
+    assert memberKind.isProperty();
+    return new KotlinPropertyInfo(
+        memberKind,
+        kmProperty.getFlags(),
+        kmProperty.getGetterFlags(),
+        kmProperty.getSetterFlags(),
+        kmProperty.getName(),
+        KotlinValueParameterInfo.fromKmValueParameter(kmProperty.getSetterParameter()));
   }
 
   public enum MemberKind {
     NONE,
 
+    CONSTRUCTOR,
     FUNCTION,
     EXTENSION_FUNCTION,
 
@@ -122,6 +234,10 @@
     EXTENSION_PROPERTY_SETTER,
     EXTENSION_PROPERTY_ANNOTATIONS;
 
+    public boolean isConstructor() {
+      return this == CONSTRUCTOR;
+    }
+
     public boolean isFunction() {
       return this == FUNCTION || isExtensionFunction();
     }
@@ -159,23 +275,37 @@
       return;
     }
 
-    KmDeclarationContainer kmDeclarationContainer = kotlinInfo.getDeclarations();
-    String companionObject = null;
-    if (kotlinInfo.isClass()) {
-      companionObject = kotlinInfo.asClass().kmClass.getCompanionObject();
-    }
-
+    Map<String, KmConstructor> kmConstructorMap = new HashMap<>();
     Map<String, KmFunction> kmFunctionMap = new HashMap<>();
     Map<String, KmProperty> kmPropertyFieldMap = new HashMap<>();
     Map<String, KmProperty> kmPropertyGetterMap = new HashMap<>();
     Map<String, KmProperty> kmPropertySetterMap = new HashMap<>();
 
-    kmDeclarationContainer.getFunctions().forEach(kmFunction -> {
-      KmFunctionProcessor functionProcessor = new KmFunctionProcessor(kmFunction, reporter);
-      if (functionProcessor.signature() != null) {
-        kmFunctionMap.put(functionProcessor.signature().asString(), kmFunction);
-      }
-    });
+    KmDeclarationContainer kmDeclarationContainer = kotlinInfo.getDeclarations();
+    String companionObject = null;
+    if (kotlinInfo.isClass()) {
+      companionObject = kotlinInfo.asClass().kmClass.getCompanionObject();
+      kotlinInfo
+          .asClass()
+          .kmClass
+          .getConstructors()
+          .forEach(
+              kmConstructor -> {
+                JvmMethodSignature methodSignature = getJvmMethodSignature(kmConstructor, reporter);
+                if (methodSignature != null) {
+                  kmConstructorMap.put(methodSignature.asString(), kmConstructor);
+                }
+              });
+    }
+    kmDeclarationContainer
+        .getFunctions()
+        .forEach(
+            kmFunction -> {
+              JvmMethodSignature methodSignature = getJvmMethodSignature(kmFunction, reporter);
+              if (methodSignature != null) {
+                kmFunctionMap.put(methodSignature.asString(), kmFunction);
+              }
+            });
     kmDeclarationContainer.getProperties().forEach(kmProperty -> {
       KmPropertyProcessor propertyProcessor = new KmPropertyProcessor(kmProperty, reporter);
       if (propertyProcessor.fieldSignature() != null) {
@@ -200,72 +330,35 @@
       if (kmPropertyFieldMap.containsKey(key)) {
         KmProperty kmProperty = kmPropertyFieldMap.get(key);
         field.setKotlinMemberInfo(
-            new KotlinMemberInfo(
+            createFieldInfo(
                 clazz == kotlinInfo.clazz
                     ? MemberKind.PROPERTY_BACKING_FIELD
                     : MemberKind.COMPANION_OBJECT_BACKING_FIELD,
-                kmProperty.getFlags(),
-                kmProperty.getFlags(),
-                kmProperty.getName()));
+                kmProperty));
       }
     }
 
     for (DexEncodedMethod method : clazz.methods()) {
-      if (method.isInitializer()) {
-        continue;
-      }
       String key = toJvmMethodSignature(method.method).asString();
-      if (kmFunctionMap.containsKey(key)) {
+      if (kmConstructorMap.containsKey(key)) {
+        // Interestingly we cannot assert that the method is a jvm initializer, because the jvm
+        // signature can be a different.
+        method.setKotlinMemberInfo(createFunctionInfoFromConstructor(kmConstructorMap.get(key)));
+      } else if (kmFunctionMap.containsKey(key)) {
         KmFunction kmFunction = kmFunctionMap.get(key);
-        if (isExtension(kmFunction)) {
-          method.setKotlinMemberInfo(
-              new KotlinMemberInfo(
-                  MemberKind.EXTENSION_FUNCTION,
-                  kmFunction.getFlags(),
-                  kmFunction.getValueParameters()));
-        } else {
-          method.setKotlinMemberInfo(
-              new KotlinMemberInfo(
-                  MemberKind.FUNCTION,
-                  kmFunction.getFlags(),
-                  kmFunction.getValueParameters()));
-        }
+        method.setKotlinMemberInfo(
+            createFunctionInfo(
+                isExtension(kmFunction) ? EXTENSION_FUNCTION : FUNCTION, kmFunction));
       } else if (kmPropertyGetterMap.containsKey(key)) {
         KmProperty kmProperty = kmPropertyGetterMap.get(key);
-        if (isExtension(kmProperty)) {
-          method.setKotlinMemberInfo(
-              new KotlinMemberInfo(
-                  MemberKind.EXTENSION_PROPERTY_GETTER,
-                  kmProperty.getGetterFlags(),
-                  kmProperty.getFlags(),
-                  kmProperty.getName()));
-        } else {
-          method.setKotlinMemberInfo(
-              new KotlinMemberInfo(
-                  MemberKind.PROPERTY_GETTER,
-                  kmProperty.getGetterFlags(),
-                  kmProperty.getFlags(),
-                  kmProperty.getName()));
-        }
+        method.setKotlinMemberInfo(
+            createPropertyInfo(
+                isExtension(kmProperty) ? EXTENSION_PROPERTY_GETTER : PROPERTY_GETTER, kmProperty));
       } else if (kmPropertySetterMap.containsKey(key)) {
         KmProperty kmProperty = kmPropertySetterMap.get(key);
-        if (isExtension(kmProperty)) {
-          method.setKotlinMemberInfo(
-              new KotlinMemberInfo(
-                  MemberKind.EXTENSION_PROPERTY_SETTER,
-                  kmProperty.getSetterFlags(),
-                  kmProperty.getFlags(),
-                  kmProperty.getName(),
-                  kmProperty.getSetterParameter()));
-        } else {
-          method.setKotlinMemberInfo(
-              new KotlinMemberInfo(
-                  MemberKind.PROPERTY_SETTER,
-                  kmProperty.getSetterFlags(),
-                  kmProperty.getFlags(),
-                  kmProperty.getName(),
-                  kmProperty.getSetterParameter()));
-        }
+        method.setKotlinMemberInfo(
+            createPropertyInfo(
+                isExtension(kmProperty) ? EXTENSION_PROPERTY_SETTER : PROPERTY_SETTER, kmProperty));
       }
     }
   }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataJvmExtensionUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataJvmExtensionUtils.java
index 474c123..855a71f 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataJvmExtensionUtils.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataJvmExtensionUtils.java
@@ -24,14 +24,12 @@
 import kotlinx.metadata.KmConstructorVisitor;
 import kotlinx.metadata.KmExtensionType;
 import kotlinx.metadata.KmFunction;
-import kotlinx.metadata.KmFunctionExtensionVisitor;
-import kotlinx.metadata.KmFunctionVisitor;
 import kotlinx.metadata.KmProperty;
 import kotlinx.metadata.KmPropertyExtensionVisitor;
 import kotlinx.metadata.KmPropertyVisitor;
 import kotlinx.metadata.jvm.JvmConstructorExtensionVisitor;
+import kotlinx.metadata.jvm.JvmExtensionsKt;
 import kotlinx.metadata.jvm.JvmFieldSignature;
-import kotlinx.metadata.jvm.JvmFunctionExtensionVisitor;
 import kotlinx.metadata.jvm.JvmMethodSignature;
 import kotlinx.metadata.jvm.JvmPropertyExtensionVisitor;
 
@@ -174,37 +172,25 @@
     }
   }
 
-  static class KmFunctionProcessor {
-    // Custom name via @JvmName("..."). Otherwise, null.
-    private JvmMethodSignature signature = null;
+  // Custom name via @JvmName("..."). Otherwise, null.
+  static JvmMethodSignature getJvmMethodSignature(KmConstructor kmConstructor, Reporter reporter) {
+    return remapJvmMethodSignature(JvmExtensionsKt.getSignature(kmConstructor), reporter);
+  }
 
-    KmFunctionProcessor(KmFunction kmFunction, Reporter reporter) {
-      kmFunction.accept(new KmFunctionVisitor() {
-        @Override
-        public KmFunctionExtensionVisitor visitExtensions(KmExtensionType type) {
-          if (type != JvmFunctionExtensionVisitor.TYPE) {
-            return null;
-          }
-          return new JvmFunctionExtensionVisitor() {
-            @Override
-            public void visit(JvmMethodSignature desc) {
-              assert signature == null : signature.asString();
-              signature = desc;
-            }
-          };
-        }
-      });
-      if (signature != null) {
-        String remappedDesc = remapKotlinTypeInDesc(signature.getDesc(), reporter);
-        if (remappedDesc != null && !remappedDesc.equals(signature.getDesc())) {
-          signature = new JvmMethodSignature(signature.getName(), remappedDesc);
-        }
+  // Custom name via @JvmName("..."). Otherwise, null.
+  static JvmMethodSignature getJvmMethodSignature(KmFunction kmFunction, Reporter reporter) {
+    return remapJvmMethodSignature(JvmExtensionsKt.getSignature(kmFunction), reporter);
+  }
+
+  private static JvmMethodSignature remapJvmMethodSignature(
+      JvmMethodSignature signature, Reporter reporter) {
+    if (signature != null) {
+      String remappedDesc = remapKotlinTypeInDesc(signature.getDesc(), reporter);
+      if (remappedDesc != null && !remappedDesc.equals(signature.getDesc())) {
+        signature = new JvmMethodSignature(signature.getName(), remappedDesc);
       }
     }
-
-    JvmMethodSignature signature() {
-      return signature;
-    }
+    return signature;
   }
 
   static class KmPropertyProcessor {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java
index 43b5cf2..2be6e27 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataSynthesizer.java
@@ -26,6 +26,7 @@
 import com.android.tools.r8.graph.GenericSignature.FieldTypeSignature;
 import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
 import com.android.tools.r8.graph.GenericSignature.TypeSignature;
+import com.android.tools.r8.kotlin.KotlinMemberInfo.KotlinFunctionInfo;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import java.util.List;
@@ -283,13 +284,17 @@
       MethodTypeSignature signature,
       AppView<AppInfoWithLiveness> appView,
       NamingLens lens) {
+    KotlinFunctionInfo kotlinFunctionInfo = method.getKotlinMemberInfo().asFunctionInfo();
+    if (kotlinFunctionInfo == null) {
+      return false;
+    }
     boolean isExtension = method.isKotlinExtensionFunction();
     for (int i = isExtension ? 1 : 0; i < method.method.proto.parameters.values.length; i++) {
       DexType parameterType = method.method.proto.parameters.values[i];
       DebugLocalInfo debugLocalInfo = method.getParameterInfo().get(i);
       String parameterName = debugLocalInfo != null ? debugLocalInfo.name.toString() : ("p" + i);
       KotlinValueParameterInfo valueParameterInfo =
-          method.getKotlinMemberInfo().getValueParameterInfo(isExtension ? i - 1 : i);
+          kotlinFunctionInfo.getValueParameterInfo(isExtension ? i - 1 : i);
       TypeSignature parameterTypeSignature = signature.getParameterTypeSignature(i);
       KmValueParameter kmValueParameter =
           toRewrittenKmValueParameter(
@@ -611,8 +616,9 @@
             return null;
           }
         }
+        assert setter.getKotlinMemberInfo().isPropertyInfo();
         KotlinValueParameterInfo valueParameterInfo =
-            setter.getKotlinMemberInfo().getValueParameterInfo(valueIndex);
+            setter.getKotlinMemberInfo().asPropertyInfo().valueParameterInfo;
         KmValueParameter kmValueParameter = toRewrittenKmValueParameter(
             valueParameterInfo, valueType, valueSignature, "value", appView, lens);
         if (kmValueParameter != null) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinValueParameterInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinValueParameterInfo.java
index 3134b8a..fcf3db6 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinValueParameterInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinValueParameterInfo.java
@@ -32,6 +32,9 @@
   }
 
   static KotlinValueParameterInfo fromKmValueParameter(KmValueParameter kmValueParameter) {
+    if (kmValueParameter == null) {
+      return null;
+    }
     KmType kmType = kmValueParameter.getType();
     return new KotlinValueParameterInfo(
         kmValueParameter.getName(),
