diff --git a/src/test/java/com/android/tools/r8/ExternalR8TestBuilder.java b/src/test/java/com/android/tools/r8/ExternalR8TestBuilder.java
index 030ae56..52d8b52 100644
--- a/src/test/java/com/android/tools/r8/ExternalR8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/ExternalR8TestBuilder.java
@@ -16,6 +16,7 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.ListUtils;
 import com.google.common.base.Charsets;
 import java.io.IOException;
 import java.nio.file.Path;
@@ -37,7 +38,7 @@
         ExternalR8TestBuilder> {
 
   // The r8.jar to run.
-  private Path r8jar = ToolHelper.getR8MainPath();
+  private List<Path> r8Classpath = ToolHelper.getClasspathForR8();
 
   // Ordered list of program jar entries.
   private final List<Path> programJars = new ArrayList<>();
@@ -127,11 +128,15 @@
       Path outputJar = outputFolder.resolve("output.jar");
       Path proguardMapFile = outputFolder.resolve("output.jar.map");
 
-      String classPath =
-          addR8ExternalDeps
-              ? r8jar.toAbsolutePath() + CLASSPATH_SEPARATOR + ToolHelper.getDeps()
-              : r8jar.toAbsolutePath().toString();
+      List<Path> classpathList = new ArrayList<>(r8Classpath);
+      if (addR8ExternalDeps) {
+        classpathList.add(ToolHelper.getDeps());
+      }
 
+      String classPath =
+          String.join(
+              CLASSPATH_SEPARATOR,
+              ListUtils.map(classpathList, p -> p.toAbsolutePath().toString()));
       List<String> command = new ArrayList<>();
       if (runtime.isDex()) {
         throw new Unimplemented();
@@ -296,7 +301,7 @@
   }
 
   public ExternalR8TestBuilder useProvidedR8(Path r8jar) {
-    this.r8jar = r8jar;
+    this.r8Classpath = Collections.singletonList(r8jar);
     return self();
   }
 
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 0831935..395f2ce 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -190,6 +190,10 @@
     return Paths.get(System.getProperty("KEEP_ANNO_JAVAC_BUILD_DIR").split(File.pathSeparator)[0]);
   }
 
+  public static List<Path> getClasspathForR8() {
+    return ImmutableList.of(getKeepAnnoPath(), getR8MainPath());
+  }
+
   public static final Path CHECKED_IN_R8_17_WITH_DEPS =
       Paths.get(THIRD_PARTY_DIR).resolve("r8").resolve("r8_with_deps_17.jar");
 
diff --git a/src/test/java/com/android/tools/r8/compilerapi/BinaryCompatibilityTestCollection.java b/src/test/java/com/android/tools/r8/compilerapi/BinaryCompatibilityTestCollection.java
index f39b8ba..dfa1e8d 100644
--- a/src/test/java/com/android/tools/r8/compilerapi/BinaryCompatibilityTestCollection.java
+++ b/src/test/java/com/android/tools/r8/compilerapi/BinaryCompatibilityTestCollection.java
@@ -44,8 +44,8 @@
  */
 public abstract class BinaryCompatibilityTestCollection<T> {
 
-  /** Jar to run tests against. */
-  public abstract Path getTargetJar();
+  /** Classpath to run tests against. */
+  public abstract List<Path> getTargetClasspath();
 
   /** Jar with tests. */
   public abstract Path getCheckedInTestJar();
@@ -103,7 +103,12 @@
     verifyConsistency();
     IntBox numberOfTestMethods = new IntBox(0);
     List<Path> classPaths =
-        ImmutableList.of(getJunitDependency(), getHamcrest(), getTargetJar(), testJar);
+        ImmutableList.<Path>builder()
+            .add(getJunitDependency())
+            .add(getHamcrest())
+            .addAll(getTargetClasspath())
+            .add(testJar)
+            .build();
     List<String> args = new ArrayList<>();
     args.add("org.junit.runner.JUnitCore");
     tests.forEach(
diff --git a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
index b1e473f..fb86105 100644
--- a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
+++ b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
@@ -111,10 +111,10 @@
     return BINARY_COMPATIBILITY_JAR;
   }
 
-  // The API tests always link against the jar that the test runner is using.
+  // The API tests always link against the classpath that the test runner is using.
   @Override
-  public Path getTargetJar() {
-    return ToolHelper.getR8MainPath();
+  public List<Path> getTargetClasspath() {
+    return ToolHelper.getClasspathForR8();
   }
 
   // Some tests expectations can depend on the lib/nonlib and internal/external behavior.
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestCollection.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestCollection.java
index 97fc50e..36aa7ce 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestCollection.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestCollection.java
@@ -62,8 +62,8 @@
   }
 
   @Override
-  public Path getTargetJar() {
-    return ToolHelper.getRetracePath();
+  public List<Path> getTargetClasspath() {
+    return ImmutableList.of(ToolHelper.getRetracePath());
   }
 
   @Override
