diff --git a/build.gradle b/build.gradle
index 501df47..7f2f61d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -30,7 +30,7 @@
     // The kotlin version is only here to specify the kotlin language level,
     // all kotlin compilations are done in tests.
     kotlinVersion = '1.8.0'
-    kotlinExtMetadataJVMVersion = '0.6.2'
+    kotlinExtMetadataJVMVersion = '0.7.0'
     smaliVersion = '3.0.3'
     errorproneVersion = '2.18.0'
     testngVersion = '6.10'
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
index 21c4b19..c0412fa 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
@@ -301,7 +301,7 @@
   const val javassist = "3.29.2-GA"
   const val junitVersion = "4.13-beta-2"
   const val kotlinVersion = "1.8.10"
-  const val kotlinMetadataVersion = "0.6.2"
+  const val kotlinMetadataVersion = "0.7.0"
   const val mockito = "2.10.0"
   const val smaliVersion = "3.0.3"
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
index bc61463..66c4f2e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -125,10 +125,7 @@
       Consumer<DexEncodedMethod> keepByteCode) {
     DexItemFactory factory = appView.dexItemFactory();
     Reporter reporter = appView.reporter();
-    KmClass kmClass = metadata.toKmClass();
-    KotlinJvmSignatureExtensionInformation extensionInformation =
-        KotlinJvmSignatureExtensionInformation.readInformationFromMessage(
-            metadata, appView.options());
+    KmClass kmClass = metadata.getKmClass();
     Map<String, DexEncodedField> fieldMap = new HashMap<>();
     for (DexEncodedField field : hostClass.fields()) {
       fieldMap.put(toJvmFieldSignature(field.getReference()).asString(), field);
@@ -138,14 +135,11 @@
       methodMap.put(toJvmMethodSignature(method.getReference()).asString(), method);
     }
     ImmutableList.Builder<KotlinConstructorInfo> notBackedConstructors = ImmutableList.builder();
-    int constructorIndex = 0;
     KotlinMetadataMembersTracker originalMembersWithKotlinInfo =
         new KotlinMetadataMembersTracker(appView);
     for (KmConstructor kmConstructor : kmClass.getConstructors()) {
-      boolean readConstructorSignature =
-          extensionInformation.hasJvmMethodSignatureExtensionForConstructor(constructorIndex++);
       KotlinConstructorInfo constructorInfo =
-          KotlinConstructorInfo.create(kmConstructor, factory, reporter, readConstructorSignature);
+          KotlinConstructorInfo.create(kmConstructor, factory, reporter);
       JvmMethodSignature signature = JvmExtensionsKt.getSignature(kmConstructor);
       if (signature != null) {
         DexEncodedMethod method = methodMap.get(signature.asString());
@@ -166,7 +160,6 @@
             factory,
             reporter,
             keepByteCode,
-            extensionInformation,
             originalMembersWithKotlinInfo);
     KotlinTypeReference anonymousObjectOrigin = getAnonymousObjectOrigin(kmClass, factory);
     boolean nameCanBeDeducedFromClassOrOrigin =
@@ -454,7 +447,7 @@
         localDelegatedProperties.rewrite(
             JvmExtensionsKt.getLocalDelegatedProperties(kmClass)::add, appView);
     return Pair.create(
-        Companion.writeClass(kmClass, getCompatibleKotlinInfo(), 0).getAnnotationData(),
+        Companion.writeClass(kmClass, getCompatibleKotlinInfo(), 0),
         rewritten || !originalMembersWithKotlinInfo.isEqual(rewrittenReferences, appView));
   }
 
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 d63d8e7..849a6fc 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
@@ -203,9 +203,9 @@
       KotlinClassMetadata kMetadata,
       AppView<?> appView,
       Consumer<DexEncodedMethod> keepByteCode) {
-    Metadata annotationData = kMetadata.getAnnotationData();
-    String packageName = annotationData.pn();
-    int[] metadataVersion = annotationData.mv();
+    Metadata metadata = kMetadata.getAnnotationData$kotlinx_metadata_jvm();
+    String packageName = metadata.pn();
+    int[] metadataVersion = metadata.mv();
     if (kMetadata instanceof KotlinClassMetadata.Class) {
       return KotlinClassInfo.create(
           (KotlinClassMetadata.Class) kMetadata,
@@ -240,7 +240,7 @@
           kotlin,
           appView);
     } else {
-      throw new MetadataError("unsupported 'k' value: " + annotationData.k());
+      throw new MetadataError("unsupported 'k' value: " + metadata.k());
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinConstructorInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinConstructorInfo.java
index c8dac29..a60cf6b 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinConstructorInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinConstructorInfo.java
@@ -41,18 +41,12 @@
   }
 
   public static KotlinConstructorInfo create(
-      KmConstructor kmConstructor,
-      DexItemFactory factory,
-      Reporter reporter,
-      boolean readConstructorSignature) {
+      KmConstructor kmConstructor, DexItemFactory factory, Reporter reporter) {
     return new KotlinConstructorInfo(
         kmConstructor.getFlags(),
         KotlinValueParameterInfo.create(kmConstructor.getValueParameters(), factory, reporter),
         KotlinVersionRequirementInfo.create(kmConstructor.getVersionRequirements()),
-        readConstructorSignature
-            ? KotlinJvmMethodSignatureInfo.create(
-                JvmExtensionsKt.getSignature(kmConstructor), factory)
-            : null);
+        KotlinJvmMethodSignatureInfo.create(JvmExtensionsKt.getSignature(kmConstructor), factory));
   }
 
   boolean rewrite(KmClass kmClass, DexEncodedMethod method, AppView<?> appView) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
index 0c159d2..e670bb5 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
@@ -59,10 +59,8 @@
       DexItemFactory factory,
       Reporter reporter,
       Consumer<DexEncodedMethod> keepByteCode,
-      KotlinJvmSignatureExtensionInformation extensionInformation,
       KotlinMetadataMembersTracker originalAssignmentTracker) {
     ImmutableList.Builder<KotlinFunctionInfo> notBackedFunctions = ImmutableList.builder();
-    int functionCounter = 0;
     for (KmFunction kmFunction : container.getFunctions()) {
       JvmMethodSignature signature = JvmExtensionsKt.getSignature(kmFunction);
       if (signature == null) {
@@ -70,11 +68,7 @@
         continue;
       }
       KotlinFunctionInfo kotlinFunctionInfo =
-          KotlinFunctionInfo.create(
-              kmFunction,
-              factory,
-              reporter,
-              extensionInformation.hasJvmMethodSignatureExtensionForFunction(functionCounter++));
+          KotlinFunctionInfo.create(kmFunction, factory, reporter);
       DexEncodedMethod method = methodSignatureMap.get(signature.asString());
       if (method == null) {
         notBackedFunctions.add(kotlinFunctionInfo);
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
index 59e482f..228aee9 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
@@ -38,12 +38,9 @@
       DexClass clazz,
       AppView<?> appView,
       Consumer<DexEncodedMethod> keepByteCode) {
-    KmPackage kmPackage = kmFileFacade.toKmPackage();
-    KotlinJvmSignatureExtensionInformation extensionInformation =
-        KotlinJvmSignatureExtensionInformation.readInformationFromMessage(
-            kmFileFacade, appView.options());
+    KmPackage kmPackage = kmFileFacade.getKmPackage();
     return new KotlinFileFacadeInfo(
-        KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode, extensionInformation),
+        KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode),
         packageName,
         metadataVersion);
   }
@@ -63,8 +60,7 @@
     KmPackage kmPackage = new KmPackage();
     boolean rewritten = packageInfo.rewrite(kmPackage, clazz, appView);
     return Pair.create(
-        Companion.writeFileFacade(kmPackage, getCompatibleKotlinInfo(), 0).getAnnotationData(),
-        rewritten);
+        Companion.writeFileFacade(kmPackage, getCompatibleKotlinInfo(), 0), rewritten);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
index 351acc9..1e387ff 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
@@ -79,10 +79,7 @@
   }
 
   static KotlinFunctionInfo create(
-      KmFunction kmFunction,
-      DexItemFactory factory,
-      Reporter reporter,
-      boolean readMethodSignature) {
+      KmFunction kmFunction, DexItemFactory factory, Reporter reporter) {
     boolean isCrossInline = false;
     List<KotlinValueParameterInfo> valueParameters =
         KotlinValueParameterInfo.create(kmFunction.getValueParameters(), factory, reporter);
@@ -99,16 +96,14 @@
         KotlinTypeInfo.create(kmFunction.getReceiverParameterType(), factory, reporter),
         valueParameters,
         KotlinTypeParameterInfo.create(kmFunction.getTypeParameters(), factory, reporter),
-        readMethodSignature
-            ? KotlinJvmMethodSignatureInfo.create(JvmExtensionsKt.getSignature(kmFunction), factory)
-            : null,
+        KotlinJvmMethodSignatureInfo.create(JvmExtensionsKt.getSignature(kmFunction), factory),
         getlambdaClassOrigin(kmFunction, factory),
         KotlinVersionRequirementInfo.create(kmFunction.getVersionRequirements()),
         KotlinContractInfo.create(kmFunction.getContract(), factory, reporter),
         isCrossInline,
         ListUtils.map(
             kmFunction.getContextReceiverTypes(),
-            contextRecieverType -> KotlinTypeInfo.create(contextRecieverType, factory, reporter)));
+            contextReceiverType -> KotlinTypeInfo.create(contextReceiverType, factory, reporter)));
   }
 
   private static KotlinTypeReference getlambdaClassOrigin(
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmSignatureExtensionInformation.java b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmSignatureExtensionInformation.java
deleted file mode 100644
index 98ebaed..0000000
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmSignatureExtensionInformation.java
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright (c) 2021, 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 com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.ListUtils;
-import com.android.tools.r8.utils.ReflectionHelper;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import kotlin.Pair;
-import kotlinx.metadata.internal.metadata.ProtoBuf;
-import kotlinx.metadata.internal.metadata.jvm.JvmProtoBuf;
-import kotlinx.metadata.jvm.KotlinClassMetadata;
-import kotlinx.metadata.jvm.KotlinClassMetadata.FileFacade;
-import kotlinx.metadata.jvm.KotlinClassMetadata.MultiFileClassPart;
-import kotlinx.metadata.jvm.KotlinClassMetadata.SyntheticClass;
-
-// Due to kotlin-metadata-jvm library synthesizing jvm method signatures from type-information
-// we do an extra check to figure out if we should model the signature. If we model it, we will
-// add name and descriptor information to the string pool for the proto message, so it is
-// better to avoid it.
-// https://github.com/Kotlin/kotlinx.reflect.lite/blob/46d47f118f9846166b6b8f8212bdbc822fe2f634/src/main/java/org/jetbrains/kotlin/serialization/jvm/JvmProtoBufUtil.kt
-
-public class KotlinJvmSignatureExtensionInformation {
-
-  private final Set<Integer> noExtensionIndicesForFunctions;
-  private final Set<Integer> noExtensionIndicesForConstructors;
-
-  private static final KotlinJvmSignatureExtensionInformation EMPTY = builder().build();
-
-  private KotlinJvmSignatureExtensionInformation(
-      Set<Integer> noExtensionIndicesForFunctions, Set<Integer> noExtensionIndicesForConstructors) {
-    this.noExtensionIndicesForFunctions = noExtensionIndicesForFunctions;
-    this.noExtensionIndicesForConstructors = noExtensionIndicesForConstructors;
-  }
-
-  public static KotlinJvmSignatureExtensionInformation readInformationFromMessage(
-      FileFacade fileFacadeMetadata, InternalOptions options) {
-    return readPackageDataFromMessage(fileFacadeMetadata, options);
-  }
-
-  public static KotlinJvmSignatureExtensionInformation readInformationFromMessage(
-      MultiFileClassPart classPart, InternalOptions options) {
-    return readPackageDataFromMessage(classPart, options);
-  }
-
-  private static KotlinJvmSignatureExtensionInformation readPackageDataFromMessage(
-      Object object, InternalOptions options) {
-    try {
-      Pair<?, ProtoBuf.Package> kotlinPairData =
-          ReflectionHelper.performReflection(
-              object,
-              ReflectionHelper.builder()
-                  .readField("packageData$delegate")
-                  .setSetAccessible(true)
-                  .done()
-                  .readMethod("getValue")
-                  .setSetAccessible(true)
-                  .done()
-                  .build());
-      return builder().visit(kotlinPairData.getSecond()).build();
-    } catch (Exception e) {
-      options.warningReadingKotlinMetadataReflective();
-      return empty();
-    }
-  }
-
-  public static KotlinJvmSignatureExtensionInformation readInformationFromMessage(
-      SyntheticClass syntheticClass, InternalOptions options) {
-    try {
-      Pair<?, ProtoBuf.Function> kotlinPairData =
-          ReflectionHelper.performReflection(
-              syntheticClass,
-              ReflectionHelper.builder()
-                  .readField("functionData$delegate")
-                  .setSetAccessible(true)
-                  .done()
-                  .readMethod("getValue")
-                  .setSetAccessible(true)
-                  .done()
-                  .build());
-      if (kotlinPairData == null) {
-        return empty();
-      }
-      return builder().visit(kotlinPairData.getSecond(), 0).build();
-    } catch (Exception e) {
-      options.warningReadingKotlinMetadataReflective();
-      return empty();
-    }
-  }
-
-  public static KotlinJvmSignatureExtensionInformation readInformationFromMessage(
-      KotlinClassMetadata.Class kMetadata, InternalOptions options) {
-    try {
-      Pair<?, ProtoBuf.Class> kotlinPairData =
-          ReflectionHelper.performReflection(
-              kMetadata,
-              ReflectionHelper.builder()
-                  .readField("classData$delegate")
-                  .setSetAccessible(true)
-                  .done()
-                  .readMethod("getValue")
-                  .setSetAccessible(true)
-                  .done()
-                  .build());
-      return builder().visit(kotlinPairData.getSecond()).build();
-    } catch (Exception e) {
-      options.warningReadingKotlinMetadataReflective();
-      return empty();
-    }
-  }
-
-  public boolean hasJvmMethodSignatureExtensionForFunction(int index) {
-    return !noExtensionIndicesForFunctions.contains(index);
-  }
-
-  public boolean hasJvmMethodSignatureExtensionForConstructor(int index) {
-    return !noExtensionIndicesForConstructors.contains(index);
-  }
-
-  public static KotlinJvmSignatureExtensionInformationBuilder builder() {
-    return new KotlinJvmSignatureExtensionInformationBuilder();
-  }
-
-  public static KotlinJvmSignatureExtensionInformation empty() {
-    return EMPTY;
-  }
-
-  private static class KotlinJvmSignatureExtensionInformationBuilder {
-
-    private final Set<Integer> noExtensionIndicesForFunctions = new HashSet<>();
-    private final Set<Integer> noExtensionIndicesForConstructors = new HashSet<>();
-
-    private KotlinJvmSignatureExtensionInformation build() {
-      return new KotlinJvmSignatureExtensionInformation(
-          noExtensionIndicesForFunctions, noExtensionIndicesForConstructors);
-    }
-
-    private KotlinJvmSignatureExtensionInformationBuilder visit(ProtoBuf.Class clazz) {
-      visitFunctions(clazz.getFunctionList());
-      visitConstructors(clazz.getConstructorList());
-      return this;
-    }
-
-    private KotlinJvmSignatureExtensionInformationBuilder visit(ProtoBuf.Package pkg) {
-      visitFunctions(pkg.getFunctionList());
-      return this;
-    }
-
-    private void visitFunctions(List<ProtoBuf.Function> functions) {
-      ListUtils.forEachWithIndex(functions, this::visit);
-    }
-
-    public KotlinJvmSignatureExtensionInformationBuilder visit(
-        ProtoBuf.Function function, int index) {
-      if (!function.hasExtension(JvmProtoBuf.methodSignature)) {
-        noExtensionIndicesForFunctions.add(index);
-      }
-      return this;
-    }
-
-    private void visitConstructors(List<ProtoBuf.Constructor> constructors) {
-      ListUtils.forEachWithIndex(
-          constructors,
-          (constructor, index) -> {
-            if (!constructor.hasExtension(JvmProtoBuf.constructorSignature)) {
-              noExtensionIndicesForConstructors.add(index);
-            }
-          });
-    }
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
index 9900e81..6f04aba 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
@@ -31,21 +31,13 @@
   }
 
   static KotlinLambdaInfo create(
-      DexClass clazz,
-      KmLambda lambda,
-      DexItemFactory factory,
-      Reporter reporter,
-      KotlinJvmSignatureExtensionInformation extensionInformation) {
+      DexClass clazz, KmLambda lambda, DexItemFactory factory, Reporter reporter) {
     if (lambda == null) {
       assert false;
       return null;
     }
     KotlinFunctionInfo kotlinFunctionInfo =
-        KotlinFunctionInfo.create(
-            lambda.function,
-            factory,
-            reporter,
-            extensionInformation.hasJvmMethodSignatureExtensionForFunction(0));
+        KotlinFunctionInfo.create(lambda.function, factory, reporter);
     JvmMethodSignature signature = JvmExtensionsKt.getSignature(lambda.function);
     if (signature != null) {
       for (DexEncodedMethod method : clazz.methods()) {
@@ -61,8 +53,7 @@
   boolean rewrite(Consumer<KmLambda> consumer, DexClass clazz, AppView<?> appView) {
     KmLambda kmLambda = consume(new KmLambda(), consumer);
     if (!hasBacking) {
-      function.rewrite(kmLambda::setFunction, null, appView);
-      return true;
+      return function.rewrite(kmLambda::setFunction, null, appView);
     }
     DexEncodedMethod backing = null;
     for (DexEncodedMethod method : clazz.methods()) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataAnnotationWrapper.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataAnnotationWrapper.java
index 6c01e1b..d34a84f 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataAnnotationWrapper.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataAnnotationWrapper.java
@@ -56,7 +56,7 @@
   }
 
   public static KotlinMetadataAnnotationWrapper wrap(KotlinClassMetadata classMetadata) {
-    Metadata annotationData = classMetadata.getAnnotationData();
+    Metadata annotationData = classMetadata.getAnnotationData$kotlinx_metadata_jvm();
     return new KotlinMetadataAnnotationWrapper(
         annotationData.k(),
         annotationData.mv(),
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
index 9276239..a06a9a2 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
@@ -89,7 +89,7 @@
         "Metadata.Class",
         sb,
         newIndent -> {
-          KotlinMetadataWriter.appendKmClass(newIndent, sb, kMetadata.toKmClass());
+          KotlinMetadataWriter.appendKmClass(newIndent, sb, kMetadata.getKmClass());
         });
     return sb.toString();
   }
@@ -102,7 +102,7 @@
         "Metadata.FileFacade",
         sb,
         newIndent -> {
-          KotlinMetadataWriter.appendKmPackage(newIndent, sb, kMetadata.toKmPackage());
+          KotlinMetadataWriter.appendKmPackage(newIndent, sb, kMetadata.getKmPackage());
         });
     return sb.toString();
   }
@@ -125,7 +125,7 @@
         newIndent -> {
           KotlinMetadataWriter.appendKeyValue(
               newIndent, "facadeClassName", sb, kMetadata.getFacadeClassName());
-          KotlinMetadataWriter.appendKmPackage(newIndent, sb, kMetadata.toKmPackage());
+          KotlinMetadataWriter.appendKmPackage(newIndent, sb, kMetadata.getKmPackage());
         });
     return sb.toString();
   }
@@ -139,7 +139,7 @@
         sb,
         newIndent -> {
           try {
-            KmLambda kmLambda = kMetadata.toKmLambda();
+            KmLambda kmLambda = kMetadata.getKmLambda();
             if (kmLambda != null) {
               KotlinMetadataWriter.appendKeyValue(
                   newIndent,
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
index 7f0b67f..9757ef4 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
@@ -71,8 +71,7 @@
               null);
     }
     return Pair.create(
-        Companion.writeMultiFileClassFacade(partClassNameStrings, getCompatibleKotlinInfo(), 0)
-            .getAnnotationData(),
+        Companion.writeMultiFileClassFacade(partClassNameStrings, getCompatibleKotlinInfo(), 0),
         rewritten);
   }
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
index a51defc..a317760 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
@@ -43,13 +43,10 @@
       DexClass clazz,
       AppView<?> appView,
       Consumer<DexEncodedMethod> keepByteCode) {
-    KmPackage kmPackage = classPart.toKmPackage();
-    KotlinJvmSignatureExtensionInformation extensionInformation =
-        KotlinJvmSignatureExtensionInformation.readInformationFromMessage(
-            classPart, appView.options());
+    KmPackage kmPackage = classPart.getKmPackage();
     return new KotlinMultiFileClassPartInfo(
         classPart.getFacadeClassName(),
-        KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode, extensionInformation),
+        KotlinPackageInfo.create(kmPackage, clazz, appView, keepByteCode),
         packageName,
         metadataVersion);
   }
@@ -69,8 +66,7 @@
     KmPackage kmPackage = new KmPackage();
     boolean rewritten = packageInfo.rewrite(kmPackage, clazz, appView);
     return Pair.create(
-        Companion.writeMultiFileClassPart(kmPackage, facadeClassName, getCompatibleKotlinInfo(), 0)
-            .getAnnotationData(),
+        Companion.writeMultiFileClassPart(kmPackage, facadeClassName, getCompatibleKotlinInfo(), 0),
         rewritten);
   }
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
index 721cd75..8455829 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
@@ -42,8 +42,7 @@
       KmPackage kmPackage,
       DexClass clazz,
       AppView<?> appView,
-      Consumer<DexEncodedMethod> keepByteCode,
-      KotlinJvmSignatureExtensionInformation extensionInformation) {
+      Consumer<DexEncodedMethod> keepByteCode) {
     Map<String, DexEncodedField> fieldMap = new HashMap<>();
     for (DexEncodedField field : clazz.fields()) {
       fieldMap.put(toJvmFieldSignature(field.getReference()).asString(), field);
@@ -63,7 +62,6 @@
             appView.dexItemFactory(),
             appView.reporter(),
             keepByteCode,
-            extensionInformation,
             originalMembersWithKotlinInfo),
         KotlinLocalDelegatedPropertyInfo.create(
             JvmExtensionsKt.getLocalDelegatedProperties(kmPackage),
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 23c7d92..4449beb 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
@@ -46,15 +46,11 @@
       DexClass clazz,
       Kotlin kotlin,
       AppView<?> appView) {
-    KmLambda lambda = syntheticClass.toKmLambda();
+    KmLambda lambda = syntheticClass.getKmLambda();
     assert lambda == null || syntheticClass.isLambda();
-    KotlinJvmSignatureExtensionInformation extensionInformation =
-        KotlinJvmSignatureExtensionInformation.readInformationFromMessage(
-            syntheticClass, appView.options());
     return new KotlinSyntheticClassInfo(
         lambda != null
-            ? KotlinLambdaInfo.create(
-                clazz, lambda, appView.dexItemFactory(), appView.reporter(), extensionInformation)
+            ? KotlinLambdaInfo.create(clazz, lambda, appView.dexItemFactory(), appView.reporter())
             : null,
         getFlavour(clazz, kotlin),
         packageName,
@@ -78,15 +74,13 @@
   @Override
   public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) {
     if (lambda == null) {
-      return Pair.create(
-          Companion.writeSyntheticClass(getCompatibleKotlinInfo(), 0).getAnnotationData(), false);
+      return Pair.create(Companion.writeSyntheticClass(getCompatibleKotlinInfo(), 0), false);
     }
     Box<KmLambda> newLambda = new Box<>();
     boolean rewritten = lambda.rewrite(newLambda::set, clazz, appView);
     assert newLambda.isSet();
     return Pair.create(
-        Companion.writeLambda(newLambda.get(), getCompatibleKotlinInfo(), 0).getAnnotationData(),
-        rewritten);
+        Companion.writeLambda(newLambda.get(), getCompatibleKotlinInfo(), 0), rewritten);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java b/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
index fc52598..9504a38 100644
--- a/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
@@ -181,7 +181,7 @@
       }
       return Optional.of(
           DataEntryResource.fromBytes(
-              writer.write(metadataVersion.get()).getBytes(),
+              writer.write(metadataVersion.get()),
               "META-INF/" + moduleName + ".kotlin_module",
               Origin.unknown()));
     }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnnotationTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnnotationTest.java
index b0dd01c..218da15 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAnnotationTest.java
@@ -175,10 +175,8 @@
     assertEquals(1, arguments.size());
     ArrayValue classes = (ArrayValue) arguments.get("classes");
     assertEquals(
-        "KClassValue(className=" + foo.getFinalBinaryName() + ", arrayDimensionCount=0)",
-        classes.getElements().get(0).toString());
+        "KClassValue(" + foo.getFinalBinaryName() + ")", classes.getElements().get(0).toString());
     assertEquals(
-        "KClassValue(className=" + bar.getFinalBinaryName() + ", arrayDimensionCount=0)",
-        classes.getElements().get(1).toString());
+        "KClassValue(" + bar.getFinalBinaryName() + ")", classes.getElements().get(1).toString());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
index 457e4a2..dc0053b 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -573,7 +573,7 @@
     }
     assertTrue(metadata instanceof KotlinClassMetadata.Class);
     KotlinClassMetadata.Class kClass = (KotlinClassMetadata.Class) metadata;
-    return new FoundKmClassSubject(codeInspector, getDexProgramClass(), kClass.toKmClass());
+    return new FoundKmClassSubject(codeInspector, getDexProgramClass(), kClass.getKmClass());
   }
 
   @Override
@@ -594,11 +594,11 @@
         || metadata instanceof KotlinClassMetadata.MultiFileClassPart);
     if (metadata instanceof KotlinClassMetadata.FileFacade) {
       KotlinClassMetadata.FileFacade kFile = (KotlinClassMetadata.FileFacade) metadata;
-      return new FoundKmPackageSubject(codeInspector, getDexProgramClass(), kFile.toKmPackage());
+      return new FoundKmPackageSubject(codeInspector, getDexProgramClass(), kFile.getKmPackage());
     } else {
       KotlinClassMetadata.MultiFileClassPart kPart =
           (KotlinClassMetadata.MultiFileClassPart) metadata;
-      return new FoundKmPackageSubject(codeInspector, getDexProgramClass(), kPart.toKmPackage());
+      return new FoundKmPackageSubject(codeInspector, getDexProgramClass(), kPart.getKmPackage());
     }
   }
 
diff --git a/third_party/dependencies.tar.gz.sha1 b/third_party/dependencies.tar.gz.sha1
index cea55a6..8d3ba4e 100644
--- a/third_party/dependencies.tar.gz.sha1
+++ b/third_party/dependencies.tar.gz.sha1
@@ -1 +1 @@
-3bfa0f5611e2f0e4beed4287cb5f9f9d3458c61b
\ No newline at end of file
+a8ce32b32965771099a4e91fedf13abfda7ffbed
diff --git a/third_party/dependencies_new.tar.gz.sha1 b/third_party/dependencies_new.tar.gz.sha1
index 621dd6c..01f988b 100644
--- a/third_party/dependencies_new.tar.gz.sha1
+++ b/third_party/dependencies_new.tar.gz.sha1
@@ -1 +1 @@
-4fad35bd436967989be01124889a973aee24ffa1
\ No newline at end of file
+d5238791ca8a92b1ea3dcd91b013ef41e1b5ca38
diff --git a/tools/create_local_maven_with_dependencies.py b/tools/create_local_maven_with_dependencies.py
index f9a0383..76caf6b 100755
--- a/tools/create_local_maven_with_dependencies.py
+++ b/tools/create_local_maven_with_dependencies.py
@@ -5,8 +5,8 @@
 
 import argparse
 import os.path
-import subprocess
 import shutil
+import subprocess
 import sys
 
 import utils
@@ -24,7 +24,7 @@
 ASM_VERSION = '9.5'
 ESPRESSO_VERSION = '3.0.0'
 FASTUTIL_VERSION = '7.2.1'
-KOTLIN_METADATA_VERSION = '0.6.2'
+KOTLIN_METADATA_VERSION = '0.7.0'
 KOTLIN_VERSION = '1.8.0'
 GUAVA_VERSION = '31.1-jre'
 GUAVA_VERSION_NEW = '32.1.2-jre'
