diff --git a/build.gradle b/build.gradle
index 1077080..433b39a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -43,6 +43,8 @@
     gsonVersion = '2.7'
     junitVersion = '4.13-beta-2'
     mockitoVersion = '2.10.0'
+    // The kotlin version is only here to specify the kotlin language level,
+    // all kotlin compilations are done in tests.
     kotlinVersion = '1.3.72'
     kotlinExtMetadataJVMVersion = '0.1.0'
     smaliVersion = '2.2b4'
@@ -148,12 +150,6 @@
             srcDirs = ['src/test/testngrunner']
         }
     }
-    examplesKotlin {
-        java {
-            srcDirs = ['src/test/examplesKotlin']
-        }
-        output.resourcesDir = 'build/classes/examplesKotlin'
-    }
     examplesAndroidN {
         java {
             srcDirs = ['src/test/examplesAndroidN']
@@ -274,7 +270,6 @@
     supportLibs "com.android.support.test.espresso:espresso-core:$espressoVersion"
     apiUsageSampleCompile sourceSets.main.output
     apiUsageSampleCompile "com.google.guava:guava:$guavaVersion"
-    examplesKotlinCompileOnly "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
     kotlinR8TestResourcesCompileOnly "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
     errorprone("com.google.errorprone:error_prone_core:$errorproneVersion")
     testImplementation "org.jetbrains.kotlin:kotlin-reflect:1.3.31"
@@ -1229,18 +1224,6 @@
     targetCompatibility = JavaVersion.VERSION_1_8
 }
 
-task buildExampleKotlinJars {
-    def kotlinSrcDir = file("src/test/examplesKotlin")
-    kotlinSrcDir.eachDir { dir ->
-        def name = dir.getName();
-        dependsOn "compile_example_kotlin_${name}"
-        task "compile_example_kotlin_${name}"(type: kotlin.Kotlinc) {
-            source = fileTree(dir: file("src/test/examplesKotlin/${name}"), include: '**/*.kt')
-            destination = file("build/test/examplesKotlin/${name}.jar")
-        }
-    }
-}
-
 task buildProtoGeneratedSources {
     def examplesProtoDir = file("src/test/examplesProto")
     examplesProtoDir.eachDir { dir ->
@@ -1622,52 +1605,15 @@
     }
 }
 
-task buildExamplesKotlin {
-    if (OperatingSystem.current().isMacOsX() || OperatingSystem.current().isWindows()) {
-        logger.lifecycle("WARNING: Testing (including building kotlin examples) is only partially" +
-                " supported on your platform (" + OperatingSystem.current().getName() + ").")
-    } else if (!OperatingSystem.current().isLinux()) {
-        logger.lifecycle("WARNING: Testing (including building kotlin examples) is not supported " +
-                "on your platform. It is fully supported on Linux and partially supported on " +
-                "Mac OS and Windows")
-        return;
-    }
-    def examplesDir = file("src/test/examplesKotlin")
-    examplesDir.eachDir { dir ->
-        def name = dir.getName();
-        dependsOn "dex_example_kotlin_${name}"
-        def exampleOutputDir = file("build/test/examplesKotlin/" + name);
-        def dexPath = file("${exampleOutputDir}")
-        task "dex_example_kotlin_${name}"(type: DxTask,
-                dependsOn: "compile_example_kotlin_${name}") {
-            doFirst {
-                if (!dexPath.exists()) {
-                    dexPath.mkdirs()
-                }
-            }
-            source = files(tasks.getByPath("compile_example_kotlin_${name}")).asFileTree
-            destination = dexPath
-            debug = false
-        }
-    }
-}
-
 task buildKotlinR8TestResources {
     def examplesDir = file("src/test/kotlinR8TestResources")
     examplesDir.eachDir { dir ->
         kotlin.Kotlinc.KotlinTargetVersion.values().each { kotlinTargetVersion ->
             def name = dir.getName()
             def taskName = "jar_kotlinR8TestResources_${name}_${kotlinTargetVersion}"
-            def outputFile = "build/test/kotlinR8TestResources/${kotlinTargetVersion}/${name}.jar"
             def javaOutput = "build/test/kotlinR8TestResources/${kotlinTargetVersion}/${name}/java"
             def javaOutputJarName = "${name}.java.jar"
             def javaOutputJarDir = "build/test/kotlinR8TestResources/${kotlinTargetVersion}"
-            task "${taskName}Kotlin"(type: kotlin.Kotlinc) {
-                source = fileTree(dir: file("${examplesDir}/${name}"),
-                        include: ['**/*.kt', '**/*.java'])
-                destination = file(outputFile)
-                targetVersion = kotlinTargetVersion
-            }
             task "${taskName}Java"(type: JavaCompile) {
                 source = fileTree(dir: file("${examplesDir}/${name}"), include: '**/*.java')
                 destinationDir = file(javaOutput)
@@ -1682,7 +1628,7 @@
                 from javaOutput
                 include "**/*.class"
             }
-            dependsOn "${taskName}Kotlin", "${taskName}JavaJar"
+            dependsOn "${taskName}JavaJar"
         }
     }
 }
@@ -2101,7 +2047,6 @@
         }
         dependsOn downloadDeps
         dependsOn buildExamples
-        dependsOn buildExamplesKotlin
         dependsOn buildKotlinR8TestResources
         dependsOn buildSmali
         dependsOn jctfCommonJar
diff --git a/src/test/java/com/android/tools/r8/KotlinTestBase.java b/src/test/java/com/android/tools/r8/KotlinTestBase.java
index 37f4222..1696327 100644
--- a/src/test/java/com/android/tools/r8/KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/KotlinTestBase.java
@@ -24,6 +24,7 @@
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 import org.hamcrest.Matcher;
+import org.junit.rules.TemporaryFolder;
 
 public abstract class KotlinTestBase extends TestBase {
 
@@ -107,6 +108,11 @@
   }
 
   public static KotlinCompileMemoizer getCompileMemoizer(
+      Collection<Path> sources, CfRuntime runtime, TemporaryFolder temporaryFolder) {
+    return new KotlinCompileMemoizer(sources, runtime, temporaryFolder);
+  }
+
+  public static KotlinCompileMemoizer getCompileMemoizer(
       Collection<Path> sources, String sharedFolder) {
     return compileMemoizers.computeIfAbsent(
         sharedFolder, ignore -> new KotlinCompileMemoizer(sources));
@@ -131,12 +137,22 @@
   public static class KotlinCompileMemoizer {
 
     private final Collection<Path> sources;
+    private final CfRuntime runtime;
+    private final TemporaryFolder temporaryFolder;
+
     private Consumer<KotlinCompilerTool> kotlinCompilerToolConsumer = x -> {};
     private final Map<KotlinCompiler, Map<KotlinTargetVersion, Path>> compiledPaths =
         new IdentityHashMap<>();
 
     public KotlinCompileMemoizer(Collection<Path> sources) {
+      this(sources, CfRuntime.getCheckedInJdk9(), null);
+    }
+
+    public KotlinCompileMemoizer(
+        Collection<Path> sources, CfRuntime runtime, TemporaryFolder temporaryFolder) {
       this.sources = sources;
+      this.runtime = runtime;
+      this.temporaryFolder = temporaryFolder;
     }
 
     public KotlinCompileMemoizer configure(Consumer<KotlinCompilerTool> consumer) {
@@ -159,10 +175,11 @@
           targetVersion,
           ignored -> {
             try {
-              return kotlinc(compiler, targetVersion)
-                  .addSourceFiles(sources)
-                  .apply(kotlinCompilerToolConsumer)
-                  .compile();
+              KotlinCompilerTool kotlinc =
+                  temporaryFolder == null
+                      ? kotlinc(compiler, targetVersion)
+                      : kotlinc(runtime, temporaryFolder, compiler, targetVersion);
+              return kotlinc.addSourceFiles(sources).apply(kotlinCompilerToolConsumer).compile();
             } catch (IOException e) {
               throw new RuntimeException(e);
             }
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesKotlinTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesKotlinTest.java
deleted file mode 100644
index 74dfeb4..0000000
--- a/src/test/java/com/android/tools/r8/R8RunExamplesKotlinTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) 2017, 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;
-
-import com.android.tools.r8.KotlinCompilerTool.KotlinCompiler;
-import com.android.tools.r8.R8Command.Builder;
-import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
-import com.android.tools.r8.utils.InternalOptions;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class R8RunExamplesKotlinTest extends R8RunExamplesCommon {
-
-  @Override
-  protected void configure(InternalOptions options) {
-    super.configure(options);
-  }
-
-  @Parameters(name = "{0}_{1}_{2}_{3}_{5}_{6}")
-  public static Collection<String[]> data() {
-    String[] tests = {
-        "loops.LoopKt"
-    };
-
-    List<String[]> fullTestList = new ArrayList<>(tests.length * 2);
-    for (String test : tests) {
-      fullTestList.add(
-          makeTest(Input.JAVAC, CompilerUnderTest.D8, CompilationMode.DEBUG, test, Output.DEX));
-      fullTestList.add(
-          makeTest(Input.JAVAC, CompilerUnderTest.D8, CompilationMode.RELEASE, test, Output.DEX));
-      fullTestList.add(makeTest(Input.DX, CompilerUnderTest.R8, CompilationMode.DEBUG, test));
-      fullTestList.add(makeTest(Input.DX, CompilerUnderTest.R8, CompilationMode.RELEASE, test));
-      fullTestList.add(
-          makeTest(Input.JAVAC, CompilerUnderTest.R8, CompilationMode.DEBUG, test, Output.CF));
-      fullTestList.add(
-          makeTest(Input.JAVAC, CompilerUnderTest.R8, CompilationMode.RELEASE, test, Output.CF));
-    }
-    return fullTestList;
-  }
-
-  @Override
-  public Builder addInputFile(Builder builder) {
-    return super.addInputFile(builder)
-        .addProgramFiles(ToolHelper.getKotlinAnnotationJar(KotlinCompiler.latest()));
-  }
-
-  @Override
-  protected String getExampleDir() {
-    return ToolHelper.EXAMPLES_KOTLIN_BUILD_DIR;
-  }
-
-  @Override
-  protected Map<String, TestCondition> getFailingRun() {
-    return Collections.emptyMap();
-  }
-
-  @Override
-  protected Map<String, TestCondition> getFailingRunCf() {
-    return Collections.emptyMap();
-  }
-
-  @Override
-  protected Set<String> getFailingCompileCfToDex() {
-    return Collections.emptySet();
-  }
-
-  @Override
-  protected Set<String> getFailingRunCfToDex() {
-    return Collections.emptySet();
-  }
-
-  @Override
-  protected Set<String> getFailingCompileCf() {
-    return Collections.emptySet();
-  }
-
-  @Override
-  protected Set<String> getFailingOutputCf() {
-    return Collections.emptySet();
-  }
-
-  @Override
-  protected Map<String, TestCondition> getOutputNotIdenticalToJVMOutput() {
-    return Collections.emptyMap();
-  }
-
-  @Override
-  protected Map<String, TestCondition> getSkip() {
-    return Collections.emptyMap();
-  }
-
-  public R8RunExamplesKotlinTest(
-      String pkg,
-      String input,
-      String compiler,
-      String mode,
-      String mainClass,
-      String output) {
-    super(pkg, input, compiler, mode, mainClass, output);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 883a2b4..16d7ddf 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -103,14 +103,10 @@
   public static final String EXAMPLES_ANDROID_N_DIR = TESTS_DIR + "examplesAndroidN/";
   public static final String EXAMPLES_ANDROID_O_DIR = TESTS_DIR + "examplesAndroidO/";
   public static final String EXAMPLES_ANDROID_P_DIR = TESTS_DIR + "examplesAndroidP/";
-  public static final String EXAMPLES_KOTLIN_DIR = TESTS_DIR + "examplesKotlin/";
   public static final String TESTS_BUILD_DIR = BUILD_DIR + "test/";
   public static final String JDK_TESTS_BUILD_DIR = TESTS_BUILD_DIR + "jdk11Tests/";
   public static final String EXAMPLES_BUILD_DIR = TESTS_BUILD_DIR + "examples/";
   public static final String EXAMPLES_CF_DIR = EXAMPLES_BUILD_DIR + "classes/";
-  public static final String EXAMPLES_KOTLIN_BUILD_DIR = TESTS_BUILD_DIR + "examplesKotlin/";
-  public static final String EXAMPLES_KOTLIN_RESOURCE_DIR =
-      TESTS_BUILD_DIR + "kotlinR8TestResources/";
   public static final String EXAMPLES_ANDROID_N_BUILD_DIR = TESTS_BUILD_DIR + "examplesAndroidN/";
   public static final String EXAMPLES_ANDROID_O_BUILD_DIR = TESTS_BUILD_DIR + "examplesAndroidO/";
   public static final String EXAMPLES_ANDROID_P_BUILD_DIR = TESTS_BUILD_DIR + "examplesAndroidP/";
diff --git a/src/test/java/com/android/tools/r8/debug/ContinuousSteppingTest.java b/src/test/java/com/android/tools/r8/debug/ContinuousSteppingTest.java
index 4552be6..b6448f5 100644
--- a/src/test/java/com/android/tools/r8/debug/ContinuousSteppingTest.java
+++ b/src/test/java/com/android/tools/r8/debug/ContinuousSteppingTest.java
@@ -4,8 +4,12 @@
 
 package com.android.tools.r8.debug;
 
+import com.android.tools.r8.KotlinCompilerTool;
+import com.android.tools.r8.KotlinTestBase;
+import com.android.tools.r8.KotlinTestBase.KotlinCompileMemoizer;
 import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestRuntime.CfRuntime;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -87,9 +91,15 @@
 
     public ConfigListBuilder addAllKotlinDebugJars(
         TemporaryFolder temp, Predicate<Version> predicate) {
+      KotlinCompileMemoizer compiledJars =
+          KotlinTestBase.getCompileMemoizer(
+                  KotlinTestBase.getKotlinFilesInResource("debug"),
+                  CfRuntime.getCheckedInJdk9(),
+                  temp)
+              .configure(KotlinCompilerTool::includeRuntime);
       for (KotlinTestParameters kotlinParameter :
           TestBase.getKotlinTestParameters().withAllCompilersAndTargetVersions().build()) {
-        add(KotlinD8Config.compileKotlinMemoized.apply(temp, kotlinParameter), predicate);
+        add(compiledJars.getForConfiguration(kotlinParameter), predicate);
       }
       return this;
     }
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinD8Config.java b/src/test/java/com/android/tools/r8/debug/KotlinD8Config.java
deleted file mode 100644
index a7e31a4..0000000
--- a/src/test/java/com/android/tools/r8/debug/KotlinD8Config.java
+++ /dev/null
@@ -1,63 +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.debug;
-
-import static com.android.tools.r8.TestBase.kotlinc;
-import static com.android.tools.r8.TestBase.memoizeBiFunction;
-
-import com.android.tools.r8.KotlinTestBase;
-import com.android.tools.r8.KotlinTestParameters;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestRuntime;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.Collections;
-import java.util.function.BiFunction;
-import org.junit.rules.TemporaryFolder;
-
-/** Shared test configuration for D8 compiled resources from the "kotlinR8TestResources/debug". */
-class KotlinD8Config extends D8DebugTestConfig {
-
-  public static BiFunction<TemporaryFolder, KotlinTestParameters, Path> compileKotlinMemoized =
-      memoizeBiFunction(KotlinD8Config::compileWithKotlinC);
-
-  private static Path compileWithKotlinC(TemporaryFolder temp, KotlinTestParameters parameters)
-      throws IOException {
-    return kotlinc(
-            TestRuntime.getCheckedInJdk9(),
-            temp,
-            parameters.getCompiler(),
-            parameters.getTargetVersion())
-        .addSourceFiles(KotlinTestBase.getKotlinFilesInResource("debug"))
-        .includeRuntime()
-        .compile();
-  }
-
-  private static BiFunction<KotlinTestParameters, AndroidApiLevel, Path> compiledResourcesMemoized =
-      memoizeBiFunction(KotlinD8Config::getCompiledResources);
-
-  private static Path getCompiledResources(
-      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) throws IOException {
-    Path outputPath =
-        TestBase.getStaticTemp().newFolder().toPath().resolve("d8_debug_test_resources_kotlin.jar");
-    Path kotlinJar = compileKotlinMemoized.apply(TestBase.getStaticTemp(), kotlinTestParameters);
-    D8DebugTestConfig.d8Compile(Collections.singletonList(kotlinJar), apiLevel, null)
-        .write(outputPath, OutputMode.DexIndexed);
-    return outputPath;
-  }
-
-  public static KotlinD8Config build(
-      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) {
-    try {
-      KotlinD8Config kotlinD8Config = new KotlinD8Config();
-      kotlinD8Config.addPaths(compiledResourcesMemoized.apply(kotlinTestParameters, apiLevel));
-      return kotlinD8Config;
-    } catch (Throwable e) {
-      throw new RuntimeException(e);
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinDebugD8Config.java b/src/test/java/com/android/tools/r8/debug/KotlinDebugD8Config.java
new file mode 100644
index 0000000..348d43a
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/debug/KotlinDebugD8Config.java
@@ -0,0 +1,52 @@
+// 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.debug;
+
+import static com.android.tools.r8.KotlinTestBase.getCompileMemoizer;
+import static com.android.tools.r8.TestBase.memoizeBiFunction;
+
+import com.android.tools.r8.KotlinCompilerTool;
+import com.android.tools.r8.KotlinTestBase;
+import com.android.tools.r8.KotlinTestBase.KotlinCompileMemoizer;
+import com.android.tools.r8.KotlinTestParameters;
+import com.android.tools.r8.OutputMode;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Collections;
+import java.util.function.BiFunction;
+
+/** Shared test configuration for D8 compiled resources from the "kotlinR8TestResources/debug". */
+class KotlinDebugD8Config extends D8DebugTestConfig {
+
+  static final KotlinCompileMemoizer compiledKotlinJars =
+      getCompileMemoizer(KotlinTestBase.getKotlinFilesInResource("debug"))
+          .configure(KotlinCompilerTool::includeRuntime);
+
+  private static final BiFunction<KotlinTestParameters, AndroidApiLevel, Path>
+      compiledResourcesMemoized = memoizeBiFunction(KotlinDebugD8Config::getCompiledResources);
+
+  private static Path getCompiledResources(
+      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) throws IOException {
+    Path outputPath =
+        TestBase.getStaticTemp().newFolder().toPath().resolve("d8_debug_test_resources_kotlin.jar");
+    Path kotlinJar = compiledKotlinJars.getForConfiguration(kotlinTestParameters);
+    D8DebugTestConfig.d8Compile(Collections.singletonList(kotlinJar), apiLevel, null)
+        .write(outputPath, OutputMode.DexIndexed);
+    return outputPath;
+  }
+
+  public static KotlinDebugD8Config build(
+      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) {
+    try {
+      KotlinDebugD8Config kotlinDebugD8Config = new KotlinDebugD8Config();
+      kotlinDebugD8Config.addPaths(compiledResourcesMemoized.apply(kotlinTestParameters, apiLevel));
+      return kotlinDebugD8Config;
+    } catch (Throwable e) {
+      throw new RuntimeException(e);
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinInlineTest.java b/src/test/java/com/android/tools/r8/debug/KotlinInlineTest.java
index 00333e0..d205f26 100644
--- a/src/test/java/com/android/tools/r8/debug/KotlinInlineTest.java
+++ b/src/test/java/com/android/tools/r8/debug/KotlinInlineTest.java
@@ -39,8 +39,8 @@
     this.kotlinParameters = kotlinParameters;
   }
 
-  protected KotlinD8Config getD8Config() {
-    return KotlinD8Config.build(kotlinParameters, parameters.getApiLevel());
+  protected KotlinDebugD8Config getD8Config() {
+    return KotlinDebugD8Config.build(kotlinParameters, parameters.getApiLevel());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinLoopD8Config.java b/src/test/java/com/android/tools/r8/debug/KotlinLoopD8Config.java
new file mode 100644
index 0000000..c1f20d3
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/debug/KotlinLoopD8Config.java
@@ -0,0 +1,52 @@
+// 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.debug;
+
+import static com.android.tools.r8.KotlinTestBase.getCompileMemoizer;
+import static com.android.tools.r8.TestBase.memoizeBiFunction;
+
+import com.android.tools.r8.KotlinCompilerTool;
+import com.android.tools.r8.KotlinTestBase;
+import com.android.tools.r8.KotlinTestBase.KotlinCompileMemoizer;
+import com.android.tools.r8.KotlinTestParameters;
+import com.android.tools.r8.OutputMode;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Collections;
+import java.util.function.BiFunction;
+
+/** Shared test configuration for D8 compiled resources from the "kotlinR8TestResources/loops". */
+class KotlinLoopD8Config extends D8DebugTestConfig {
+
+  static final KotlinCompileMemoizer compiledKotlinJars =
+      getCompileMemoizer(KotlinTestBase.getKotlinFilesInResource("loops"))
+          .configure(KotlinCompilerTool::includeRuntime);
+
+  private static final BiFunction<KotlinTestParameters, AndroidApiLevel, Path>
+      compiledResourcesMemoized = memoizeBiFunction(KotlinLoopD8Config::getCompiledResources);
+
+  private static Path getCompiledResources(
+      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) throws IOException {
+    Path outputPath =
+        TestBase.getStaticTemp().newFolder().toPath().resolve("d8_debug_test_resources_kotlin.jar");
+    Path kotlinJar = compiledKotlinJars.getForConfiguration(kotlinTestParameters);
+    D8DebugTestConfig.d8Compile(Collections.singletonList(kotlinJar), apiLevel, null)
+        .write(outputPath, OutputMode.DexIndexed);
+    return outputPath;
+  }
+
+  public static KotlinLoopD8Config build(
+      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) {
+    try {
+      KotlinLoopD8Config kotlinDebugD8Config = new KotlinLoopD8Config();
+      kotlinDebugD8Config.addPaths(compiledResourcesMemoized.apply(kotlinTestParameters, apiLevel));
+      return kotlinDebugD8Config;
+    } catch (Throwable e) {
+      throw new RuntimeException(e);
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinLoopTest.java b/src/test/java/com/android/tools/r8/debug/KotlinLoopTest.java
index 85c3ec5..ef55a6d 100644
--- a/src/test/java/com/android/tools/r8/debug/KotlinLoopTest.java
+++ b/src/test/java/com/android/tools/r8/debug/KotlinLoopTest.java
@@ -3,15 +3,34 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.debug;
 
-import com.android.tools.r8.ToolHelper;
-import java.nio.file.Paths;
+import com.android.tools.r8.KotlinTestParameters;
+import com.android.tools.r8.TestParameters;
+import java.util.List;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
+@RunWith(Parameterized.class)
 public class KotlinLoopTest extends KotlinDebugTestBase {
 
+  private final TestParameters parameters;
+  private final KotlinTestParameters kotlinParameters;
+
+  @Parameters(name = "{0}, {1}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withDexRuntimes().withAllApiLevels().build(),
+        getKotlinTestParameters().withAllCompilersAndTargetVersions().build());
+  }
+
+  public KotlinLoopTest(TestParameters parameters, KotlinTestParameters kotlinParameters) {
+    this.parameters = parameters;
+    this.kotlinParameters = kotlinParameters;
+  }
+
   DebugTestConfig config() {
-    return new D8DebugTestConfig()
-        .compileAndAdd(temp, Paths.get(ToolHelper.EXAMPLES_KOTLIN_BUILD_DIR, "loops.jar"));
+    return KotlinLoopD8Config.build(kotlinParameters, parameters.getApiLevel());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinTest.java b/src/test/java/com/android/tools/r8/debug/KotlinTest.java
index 07e9e05..4c9f8c0 100644
--- a/src/test/java/com/android/tools/r8/debug/KotlinTest.java
+++ b/src/test/java/com/android/tools/r8/debug/KotlinTest.java
@@ -32,8 +32,8 @@
     this.kotlinParameters = kotlinParameters;
   }
 
-  protected KotlinD8Config getD8Config() {
-    return KotlinD8Config.build(kotlinParameters, parameters.getApiLevel());
+  protected KotlinDebugD8Config getD8Config() {
+    return KotlinDebugD8Config.build(kotlinParameters, parameters.getApiLevel());
   }
 
   // TODO(shertz) simplify test
diff --git a/src/test/java/com/android/tools/r8/kotlin/optimize/switches/KotlinEnumSwitchTest.java b/src/test/java/com/android/tools/r8/kotlin/optimize/switches/KotlinEnumSwitchTest.java
index 265aa24..9c01d63 100644
--- a/src/test/java/com/android/tools/r8/kotlin/optimize/switches/KotlinEnumSwitchTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/optimize/switches/KotlinEnumSwitchTest.java
@@ -10,12 +10,12 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertNotEquals;
 
-import com.android.tools.r8.TestBase;
+import com.android.tools.r8.KotlinCompilerTool;
+import com.android.tools.r8.KotlinTestBase;
+import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import java.nio.file.Paths;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -23,18 +23,28 @@
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
-public class KotlinEnumSwitchTest extends TestBase {
+public class KotlinEnumSwitchTest extends KotlinTestBase {
 
   private final boolean enableSwitchMapRemoval;
   private final TestParameters parameters;
 
-  @Parameters(name = "{1}, enable switch map removal: {0}")
+  @Parameters(name = "{1}, enable switch map removal: {0}, {2}")
   public static List<Object[]> data() {
     return buildParameters(
-        BooleanUtils.values(), getTestParameters().withAllRuntimesAndApiLevels().build());
+        BooleanUtils.values(),
+        getTestParameters().withAllRuntimesAndApiLevels().build(),
+        getKotlinTestParameters().withAllCompilersAndTargetVersions().build());
   }
 
-  public KotlinEnumSwitchTest(boolean enableSwitchMapRemoval, TestParameters parameters) {
+  private static final KotlinCompileMemoizer kotlinJars =
+      getCompileMemoizer(getKotlinFilesInResource("enumswitch"))
+          .configure(KotlinCompilerTool::includeRuntime);
+
+  public KotlinEnumSwitchTest(
+      boolean enableSwitchMapRemoval,
+      TestParameters parameters,
+      KotlinTestParameters kotlinParameters) {
+    super(kotlinParameters);
     this.enableSwitchMapRemoval = enableSwitchMapRemoval;
     this.parameters = parameters;
   }
@@ -43,8 +53,7 @@
   public void test() throws Exception {
     testForR8(parameters.getBackend())
         .addProgramFiles(
-            Paths.get(ToolHelper.EXAMPLES_KOTLIN_BUILD_DIR, "enumswitch.jar"),
-            getMostRecentKotlinAnnotationJar())
+            kotlinJars.getForConfiguration(kotlinParameters), getMostRecentKotlinAnnotationJar())
         .addKeepMainRule("enumswitch.EnumSwitchKt")
         .addOptionsModification(
             options -> {
diff --git a/src/test/java/com/android/tools/r8/naming/b139991218/TestRunner.java b/src/test/java/com/android/tools/r8/naming/b139991218/TestRunner.java
index 10ce37d..d9b9a3c 100644
--- a/src/test/java/com/android/tools/r8/naming/b139991218/TestRunner.java
+++ b/src/test/java/com/android/tools/r8/naming/b139991218/TestRunner.java
@@ -10,15 +10,15 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.TestBase;
+import com.android.tools.r8.KotlinCompilerTool;
+import com.android.tools.r8.KotlinTestBase;
+import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
 import com.android.tools.r8.ir.optimize.Inliner.Reason;
-import com.android.tools.r8.utils.FileUtils;
 import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
-import java.nio.file.Paths;
+import java.util.List;
 import java.util.concurrent.ExecutionException;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -33,16 +33,26 @@
  * which is why the ASMified code is generated from kotlin.
  */
 @RunWith(Parameterized.class)
-public class TestRunner extends TestBase {
+public class TestRunner extends KotlinTestBase {
 
   private final TestParameters parameters;
 
+  private static final KotlinCompileMemoizer kotlinJars =
+      getCompileMemoizer(getKotlinFilesInResource("lambdas_kstyle_generics"))
+          .configure(KotlinCompilerTool::includeRuntime);
+
   @Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withDexRuntimes().withAllApiLevels().build();
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withDexRuntimes().withAllApiLevels().build(),
+        getKotlinTestParameters()
+            .withAllCompilers()
+            .withTargetVersion(KotlinTargetVersion.JAVA_8)
+            .build());
   }
 
-  public TestRunner(TestParameters parameters) {
+  public TestRunner(TestParameters parameters, KotlinTestParameters kotlinParameters) {
+    super(kotlinParameters);
     this.parameters = parameters;
   }
 
@@ -52,12 +62,7 @@
     testForR8(parameters.getBackend())
         .addProgramClassFileData(Lambda1.dump(), Lambda2.dump(), Main.dump(), Alpha.dump())
         .addProgramFiles(
-            Paths.get(
-                ToolHelper.TESTS_BUILD_DIR,
-                "kotlinR8TestResources",
-                "JAVA_8",
-                "lambdas_kstyle_generics" + FileUtils.JAR_EXTENSION),
-            getMostRecentKotlinAnnotationJar())
+            kotlinJars.getForConfiguration(kotlinParameters), getMostRecentKotlinAnnotationJar())
         .addKeepMainRule(Main.class)
         .addKeepAllAttributes()
         .addOptionsModification(
diff --git a/src/test/examplesKotlin/enumswitch/EnumSwitch.kt b/src/test/kotlinR8TestResources/enumswitch/EnumSwitch.kt
similarity index 100%
rename from src/test/examplesKotlin/enumswitch/EnumSwitch.kt
rename to src/test/kotlinR8TestResources/enumswitch/EnumSwitch.kt
diff --git a/src/test/examplesKotlin/loops/Loop.kt b/src/test/kotlinR8TestResources/loops/Loop.kt
similarity index 100%
rename from src/test/examplesKotlin/loops/Loop.kt
rename to src/test/kotlinR8TestResources/loops/Loop.kt
