diff --git a/src/test/examplesJava17/records/RecordBlogTest.java b/src/test/examplesJava17/records/RecordBlogTest.java
index 1128f07..37f1117 100644
--- a/src/test/examplesJava17/records/RecordBlogTest.java
+++ b/src/test/examplesJava17/records/RecordBlogTest.java
@@ -57,7 +57,7 @@
 
   private boolean isCfRuntimeWithNativeRecordSupport() {
     return parameters.isCfRuntime()
-        && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK14)
+        && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17)
         && parameters.getApiLevel().equals(AndroidApiLevel.B);
   }
 
diff --git a/src/test/examplesJava17/records/RecordHashCodeManyFieldsTest.java b/src/test/examplesJava17/records/RecordHashCodeManyFieldsTest.java
index 6c2a31b..1cd7313 100644
--- a/src/test/examplesJava17/records/RecordHashCodeManyFieldsTest.java
+++ b/src/test/examplesJava17/records/RecordHashCodeManyFieldsTest.java
@@ -37,7 +37,7 @@
 
   private boolean isCfRuntimeWithNativeRecordSupport() {
     return parameters.isCfRuntime()
-        && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK14)
+        && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17)
         && parameters.getApiLevel().equals(AndroidApiLevel.B);
   }
 
diff --git a/src/test/examplesJava17/records/RecordHashCodeTest.java b/src/test/examplesJava17/records/RecordHashCodeTest.java
index b0b0b0e..b5a21f4 100644
--- a/src/test/examplesJava17/records/RecordHashCodeTest.java
+++ b/src/test/examplesJava17/records/RecordHashCodeTest.java
@@ -37,7 +37,7 @@
 
   private boolean isCfRuntimeWithNativeRecordSupport() {
     return parameters.isCfRuntime()
-        && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK14)
+        && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17)
         && parameters.getApiLevel().equals(AndroidApiLevel.B);
   }
 
diff --git a/src/test/examplesJava17/records/RecordInterfaceTest.java b/src/test/examplesJava17/records/RecordInterfaceTest.java
index d5144b0..583ccb4 100644
--- a/src/test/examplesJava17/records/RecordInterfaceTest.java
+++ b/src/test/examplesJava17/records/RecordInterfaceTest.java
@@ -48,7 +48,7 @@
 
   private boolean isCfRuntimeWithNativeRecordSupport() {
     return parameters.isCfRuntime()
-        && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK14)
+        && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17)
         && parameters.getApiLevel().equals(AndroidApiLevel.B);
   }
 
diff --git a/src/test/examplesJava17/records/RecordInvokeCustomTest.java b/src/test/examplesJava17/records/RecordInvokeCustomTest.java
index ec3956a..55c9d9c 100644
--- a/src/test/examplesJava17/records/RecordInvokeCustomTest.java
+++ b/src/test/examplesJava17/records/RecordInvokeCustomTest.java
@@ -4,18 +4,17 @@
 
 package records;
 
+import com.android.tools.r8.JdkClassFileProvider;
 import com.android.tools.r8.R8FullTestBuilder;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRuntime.CfRuntime;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.desugar.LibraryFilesHelper;
 import com.android.tools.r8.utils.StringUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import records.RecordInvokeCustom.Empty;
-import records.RecordInvokeCustom.Person;
 
 @RunWith(Parameterized.class)
 public class RecordInvokeCustomTest extends TestBase {
@@ -83,7 +82,9 @@
             .addKeepMainRule(RecordInvokeCustom.class);
     if (parameters.isCfRuntime()) {
       builder
-          .addLibraryFiles(LibraryFilesHelper.getJdk15LibraryFiles(temp))
+          .addLibraryProvider(
+              JdkClassFileProvider.fromSystemModulesJdk(
+                  CfRuntime.getCheckedInJdk17().getJavaHome()))
           .compile()
           .inspect(RecordTestUtils::assertRecordsAreRecords)
           .run(parameters.getRuntime(), RecordInvokeCustom.class)
diff --git a/src/test/examplesJava17/records/SimpleRecordTest.java b/src/test/examplesJava17/records/SimpleRecordTest.java
index d7c8131..cfedd02 100644
--- a/src/test/examplesJava17/records/SimpleRecordTest.java
+++ b/src/test/examplesJava17/records/SimpleRecordTest.java
@@ -47,7 +47,7 @@
 
   private boolean isCfRuntimeWithNativeRecordSupport() {
     return parameters.isCfRuntime()
-        && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK14)
+        && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17)
         && parameters.getApiLevel().equals(AndroidApiLevel.B);
   }
 
diff --git a/src/test/java/com/android/tools/r8/rewrite/JavaScriptScriptEngineTest.java b/src/test/java/com/android/tools/r8/rewrite/JavaScriptScriptEngineTest.java
index 241c2f3..4af8c94 100644
--- a/src/test/java/com/android/tools/r8/rewrite/JavaScriptScriptEngineTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/JavaScriptScriptEngineTest.java
@@ -85,7 +85,7 @@
         .run(parameters.getRuntime(), TestClass.class)
         .applyIf(
             // No default JS engine starting from JDK-14 where Nashorn was removed, see b/227162584.
-            parameters.isCfRuntime() && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK14),
+            parameters.isCfRuntime() && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17),
             r -> r.assertFailureWithErrorThatThrows(NullPointerException.class),
             r ->
                 r.assertSuccessWithOutput(
diff --git a/src/test/java/com/android/tools/r8/rewrite/ScriptEngineTest.java b/src/test/java/com/android/tools/r8/rewrite/ScriptEngineTest.java
index a8e80aa..6865487 100644
--- a/src/test/java/com/android/tools/r8/rewrite/ScriptEngineTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/ScriptEngineTest.java
@@ -115,7 +115,7 @@
           parameters.isCfRuntime()
               // No default JS engine starting from JDK-14 where Nashorn was removed,
               // see b/227162584.
-              ? (parameters.isCfRuntime() && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK14)
+              ? (parameters.isCfRuntime() && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17)
                   ? StringUtils.lines("MyEngine1", "MyEngine2")
                   : StringUtils.lines("MyEngine1", "MyEngine2", "Oracle Nashorn"))
               : StringUtils.lines("Mozilla Rhino", "MyEngine1", "MyEngine2"));
diff --git a/src/test/testbase/java/com/android/tools/r8/TestRuntime.java b/src/test/testbase/java/com/android/tools/r8/TestRuntime.java
index f14cec1..889f7a3 100644
--- a/src/test/testbase/java/com/android/tools/r8/TestRuntime.java
+++ b/src/test/testbase/java/com/android/tools/r8/TestRuntime.java
@@ -35,11 +35,6 @@
     JDK9("jdk9", 53),
     JDK10("jdk10", 54),
     JDK11("jdk11", 55),
-    JDK12("jdk12", 56),
-    JDK13("jdk13", 57),
-    JDK14("jdk14", 58),
-    JDK15("jdk15", 59),
-    JDK16("jdk16", 60),
     JDK17("jdk17", 61),
     JDK18("jdk18", 62),
     JDK20("jdk20", 64),
diff --git a/src/test/testbase/java/com/android/tools/r8/desugar/LibraryFilesHelper.java b/src/test/testbase/java/com/android/tools/r8/desugar/LibraryFilesHelper.java
index 0a605cb..a618531 100644
--- a/src/test/testbase/java/com/android/tools/r8/desugar/LibraryFilesHelper.java
+++ b/src/test/testbase/java/com/android/tools/r8/desugar/LibraryFilesHelper.java
@@ -39,48 +39,6 @@
     return getJdk9LibraryFiles(temp);
   }
 
-  public static Path[] getJdk15LibraryFiles(TemporaryFolder temp) throws Exception {
-    // TODO(b/270105162): We should be able to run this on windows.
-    Assume.assumeFalse(ToolHelper.isWindows());
-    // TODO(b/169645628): Add JDK-15 runtime jar instead. As a temporary solution we use the jdk 8
-    //   runtime with additional stubs.
-    Path generatedJar = temp.newFolder().toPath().resolve("stubs.jar");
-    ZipBuilder builder = ZipBuilder.builder(generatedJar);
-    addRecord(builder);
-    addRecordComponent(builder);
-    addObjectsMethod(builder);
-    addTypeDescriptor(builder);
-    builder.build();
-    return ObjectArrays.concat(getJdk9LibraryFiles(temp), new Path[] {generatedJar}, Path.class);
-  }
-
-  // Generates a class file for:
-  // <pre>
-  // public class ObjectMethods {}
-  // </pre>
-  private static void addObjectsMethod(ZipBuilder builder) throws Exception {
-    addClassToZipBuilder(
-        builder, ACC_PUBLIC, "java/lang/runtime/ObjectMethods", ConsumerUtils.emptyConsumer());
-  }
-
-  // Generates a class file for:
-  // <pre>
-  // public interface TypeDescriptor {
-  //   String descriptorString();
-  // }
-  // </pre>
-  private static void addTypeDescriptor(ZipBuilder builder) throws Exception {
-    addClassToZipBuilder(
-        builder,
-        ACC_PUBLIC | ACC_INTERFACE | ACC_ABSTRACT,
-        "java/lang/invoke/TypeDescriptor",
-        methodAdder ->
-            methodAdder.add(
-                ACC_PUBLIC | ACC_ABSTRACT,
-                "descriptorString",
-                methodDescriptor(false, String.class)));
-  }
-
   // Generates a class file for:
   // <pre>
   // public class StringConcatFactory {}
@@ -101,45 +59,6 @@
 
   // Generates a class file for:
   // <pre>
-  // public abstract class Record {
-  //   protected Record() {}
-  //
-  //   public abstract boolean equals(Object obj);
-  //
-  //   public abstract int hashCode();
-  //
-  //   public abstract String toString();
-  // }
-  // </pre>
-  private static void addRecord(ZipBuilder builder) throws Exception {
-    addClassToZipBuilder(
-        builder,
-        ACC_PUBLIC | ACC_ABSTRACT,
-        "java/lang/Record",
-        methodAdder -> {
-          methodAdder.add(ACC_PROTECTED, "<init>", "()V");
-          methodAdder.add(
-              ACC_PUBLIC | ACC_ABSTRACT,
-              "equals",
-              methodDescriptor(false, Object.class, boolean.class));
-          methodAdder.add(
-              ACC_PUBLIC | ACC_ABSTRACT, "hashCode", methodDescriptor(false, int.class));
-          methodAdder.add(
-              ACC_PUBLIC | ACC_ABSTRACT, "toString", methodDescriptor(false, String.class));
-        });
-  }
-
-  // Generates a class file for:
-  // <pre>
-  // public class RecordComponent {}
-  // </pre>
-  private static void addRecordComponent(ZipBuilder builder) throws Exception {
-    addClassToZipBuilder(
-        builder, ACC_PUBLIC, "java/lang/reflect/RecordComponent", ConsumerUtils.emptyConsumer());
-  }
-
-  // Generates a class file for:
-  // <pre>
   // public interface Supplier {
   //   Object get();
   // }
diff --git a/tools/jdk.py b/tools/jdk.py
index d795230..86f2c3a 100755
--- a/tools/jdk.py
+++ b/tools/jdk.py
@@ -10,8 +10,7 @@
 
 JDK_DIR = os.path.join(defines.THIRD_PARTY, 'openjdk')
 
-ALL_JDKS = ['openjdk-9.0.4', 'jdk-11', 'jdk-15', 'jdk-16', 'jdk-17',
-            'jdk-18', 'jdk-21', 'jdk-23']
+ALL_JDKS = ['openjdk-9.0.4', 'jdk-11', 'jdk-17', 'jdk-21', 'jdk-23']
 
 
 def GetJdkHome():
