diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
index bee603b..b1ca8e7 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
@@ -356,7 +356,7 @@
   const val javassist = "3.29.2-GA"
   const val junitVersion = "4.13-beta-2"
   const val kotlinVersion = "1.9.0"
-  const val kotlinMetadataVersion = "0.7.0"
+  const val kotlinMetadataVersion = "0.9.0"
   const val mockito = "2.10.0"
   const val smaliVersion = "3.0.3"
 }
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 91d36c7..7ade086 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
@@ -25,7 +25,7 @@
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 import kotlin.Metadata;
-import kotlinx.metadata.InconsistentKotlinMetadataException;
+import kotlinx.metadata.jvm.JvmMetadataVersion;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 import kotlinx.metadata.jvm.KotlinClassMetadata.FileFacade;
 import kotlinx.metadata.jvm.KotlinClassMetadata.MultiFileClassFacade;
@@ -181,9 +181,9 @@
     Integer xi = extraInt == null ? null : (Integer) extraInt.value.getBoxedValue();
 
     try {
-      return KotlinClassMetadata.read(
+      return KotlinClassMetadata.readStrict(
           new KotlinMetadataAnnotationWrapper(k, mv, d1, d2, xs, pn, xi));
-    } catch (ClassCastException | InconsistentKotlinMetadataException | MetadataError e) {
+    } catch (ClassCastException | IllegalArgumentException | MetadataError e) {
       throw new KotlinMetadataException(e);
     }
   }
@@ -196,15 +196,29 @@
     return (Integer) kind.value.getBoxedValue();
   }
 
+  public static Metadata extractMetadataWithPossiblyUnsupportedMetadataVersion(
+      KotlinClassMetadata kMetadata) {
+    JvmMetadataVersion version = kMetadata.getVersion();
+    if (version.getMajor() == 1 && version.getMinor() < 4) {
+      // From version 0.8.0 the kotlin metadata library cannot write metadata below Kotlin version
+      // 1.4. The writer can be tricked by temporarily setting a high enough version.
+      kMetadata.setVersion(KotlinJvmMetadataVersionUtils.MIN_SUPPORTED_VERSION);
+      Metadata metadata = kMetadata.write();
+      kMetadata.setVersion(version);
+      return metadata;
+    }
+    return kMetadata.write();
+  }
+
   public static KotlinClassLevelInfo createKotlinInfo(
       Kotlin kotlin,
       DexClass clazz,
       KotlinClassMetadata kMetadata,
       AppView<?> appView,
       Consumer<DexEncodedMethod> keepByteCode) {
-    Metadata metadata = kMetadata.getAnnotationData$kotlinx_metadata_jvm();
+    Metadata metadata = extractMetadataWithPossiblyUnsupportedMetadataVersion(kMetadata);
     String packageName = metadata.pn();
-    int[] metadataVersion = metadata.mv();
+    int[] metadataVersion = KotlinJvmMetadataVersionUtils.toIntArray(kMetadata.getVersion());
     if (kMetadata instanceof KotlinClassMetadata.Class) {
       return KotlinClassInfo.create(
           (KotlinClassMetadata.Class) kMetadata,
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMetadataVersionUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMetadataVersionUtils.java
new file mode 100644
index 0000000..acf75d3
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMetadataVersionUtils.java
@@ -0,0 +1,16 @@
+// Copyright (c) 2024, 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 kotlinx.metadata.jvm.JvmMetadataVersion;
+
+public class KotlinJvmMetadataVersionUtils {
+
+  public static JvmMetadataVersion MIN_SUPPORTED_VERSION = new JvmMetadataVersion(1, 4, 0);
+
+  public static int[] toIntArray(JvmMetadataVersion version) {
+    return new int[] {version.getMajor(), version.getMinor(), version.getPatch()};
+  }
+}
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 d34a84f..149fec9 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataAnnotationWrapper.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataAnnotationWrapper.java
@@ -56,10 +56,12 @@
   }
 
   public static KotlinMetadataAnnotationWrapper wrap(KotlinClassMetadata classMetadata) {
-    Metadata annotationData = classMetadata.getAnnotationData$kotlinx_metadata_jvm();
+    Metadata annotationData =
+        KotlinClassMetadataReader.extractMetadataWithPossiblyUnsupportedMetadataVersion(
+            classMetadata);
     return new KotlinMetadataAnnotationWrapper(
         annotationData.k(),
-        annotationData.mv(),
+        KotlinJvmMetadataVersionUtils.toIntArray(classMetadata.getVersion()),
         annotationData.d1(),
         annotationData.d2(),
         annotationData.xs(),
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 9504a38..76c2314 100644
--- a/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/naming/KotlinModuleSynthesizer.java
@@ -24,7 +24,9 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import kotlinx.metadata.jvm.KotlinModuleMetadata.Writer;
+import kotlinx.metadata.jvm.JvmMetadataVersion;
+import kotlinx.metadata.jvm.KmModule;
+import kotlinx.metadata.jvm.KotlinModuleMetadata;
 
 /**
  * The kotlin module synthesizer will scan through all file facades and multiclass files to figure
@@ -155,7 +157,7 @@
         }
       }
       Collections.sort(packagesSorted);
-      Writer writer = new Writer();
+      KmModule kmModule = new KmModule();
       for (String newPackage : packagesSorted) {
         // Calling other visitors than visitPackageParts are currently not supported.
         // https://github.com/JetBrains/kotlin/blob/master/libraries/kotlinx-metadata/
@@ -174,14 +176,15 @@
                             newMultiFiles.put(classPart, rewrittenName);
                           });
                 });
-        writer.visitPackageParts(
+        kmModule.visitPackageParts(
             newPackage,
             newFacades.getOrDefault(newPackage, Collections.emptyList()),
             newMultiFiles);
       }
       return Optional.of(
           DataEntryResource.fromBytes(
-              writer.write(metadataVersion.get()),
+              new KotlinModuleMetadata(kmModule, new JvmMetadataVersion(metadataVersion.get()))
+                  .write(),
               "META-INF/" + moduleName + ".kotlin_module",
               Origin.unknown()));
     }
diff --git a/third_party/dependencies.tar.gz.sha1 b/third_party/dependencies.tar.gz.sha1
index a916904..318fa05 100644
--- a/third_party/dependencies.tar.gz.sha1
+++ b/third_party/dependencies.tar.gz.sha1
@@ -1 +1 @@
-b359a23d49694aabe18bf8c47b2bf3e5b1b77322
\ No newline at end of file
+b45ff19ad4f25508e04cf6c5fbff5279e4d04129
\ No newline at end of file
diff --git a/tools/create_local_maven_with_dependencies.py b/tools/create_local_maven_with_dependencies.py
index c151352..5ee21aa 100755
--- a/tools/create_local_maven_with_dependencies.py
+++ b/tools/create_local_maven_with_dependencies.py
@@ -24,7 +24,7 @@
 ASM_VERSION = '9.6' # When updating update tools/asmifier.py and Toolhelper as well.
 ESPRESSO_VERSION = '3.0.0'
 FASTUTIL_VERSION = '7.2.1'
-KOTLIN_METADATA_VERSION = '0.7.0'
+KOTLIN_METADATA_VERSION = '0.9.0'
 KOTLIN_VERSION = '1.9.20'
 GUAVA_VERSION = '32.1.2-jre'
 GSON_VERSION = '2.10.1'
