diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
index eab8ce4..cc9d447 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
@@ -1075,20 +1075,13 @@
 }
 
 fun getThirdPartyProguards(): List<ThirdPartyDependency> {
-  return listOf(
-      "proguard5.2.1",
-      "proguard6.0.1",
-      "proguard-7.0.0",
-      "proguard-7.3.2",
-      "proguard-7.4.1",
+  return listOf("proguard-7.0.0", "proguard-7.3.2", "proguard-7.4.1").map {
+    ThirdPartyDependency(
+      it,
+      Paths.get("third_party", "proguard", it).toFile(),
+      Paths.get("third_party", "proguard", "${it}.tar.gz.sha1").toFile(),
     )
-    .map {
-      ThirdPartyDependency(
-        it,
-        Paths.get("third_party", "proguard", it).toFile(),
-        Paths.get("third_party", "proguard", "${it}.tar.gz.sha1").toFile(),
-      )
-    }
+  }
 }
 
 fun getThirdPartyKotlinCompilers(): List<ThirdPartyDependency> {
diff --git a/src/test/java/com/android/tools/r8/compatproguard/ifrules/ConditionalOnInlinedTest.java b/src/test/java/com/android/tools/r8/compatproguard/ifrules/ConditionalOnInlinedTest.java
index 4a9e493..fa16d54 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/ifrules/ConditionalOnInlinedTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/ifrules/ConditionalOnInlinedTest.java
@@ -6,7 +6,6 @@
 import static org.junit.Assume.assumeFalse;
 import static org.junit.Assume.assumeTrue;
 
-import com.android.tools.r8.ProguardVersion;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRunResult;
@@ -77,7 +76,7 @@
   private TestShrinkerBuilder<?, ?, ?, ?, ?> buildShrinker(Shrinker shrinker) {
     TestShrinkerBuilder<?, ?, ?, ?, ?> builder;
     if (shrinker == Shrinker.Proguard) {
-      builder = testForProguard(ProguardVersion.V6_0_1).addDontWarn(ConditionalOnInlinedTest.class);
+      builder = testForProguard().addDontWarn(ConditionalOnInlinedTest.class);
     } else if (shrinker == Shrinker.R8Compat) {
       builder = testForR8Compat(parameters.getBackend());
     } else {
@@ -112,23 +111,16 @@
   public void testConditionalOnClassAndMethod() throws Exception {
     assumeTrue(optionalShrinker.isPresent());
     Shrinker shrinker = optionalShrinker.get();
-    TestRunResult<?> result =
-        buildShrinker(shrinker)
-            .addKeepRules(
-                "-if class "
-                    + A.class.getTypeName()
-                    + " { void method(java.lang.String); }"
-                    + " -keep class "
-                    + B.class.getTypeName()
-                    + " { void <init>(); void method(); }")
-            .compile()
-            .run(parameters.getRuntime(), MAIN_CLASS, B.class.getTypeName());
-    if (shrinker == Shrinker.Proguard) {
-      // In this case PG appears to not actually keep the consequent, but it does remain renamed
-      // in the output.
-      result.assertFailureWithErrorThatThrows(ClassNotFoundException.class);
-    } else {
-      result.assertSuccessWithOutput(EXPECTED);
-    }
+    buildShrinker(shrinker)
+        .addKeepRules(
+            "-if class "
+                + A.class.getTypeName()
+                + " { void method(java.lang.String); }"
+                + " -keep class "
+                + B.class.getTypeName()
+                + " { void <init>(); void method(); }")
+        .compile()
+        .run(parameters.getRuntime(), MAIN_CLASS, B.class.getTypeName())
+        .assertSuccessWithOutput(EXPECTED);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/naming/AdaptResourceFileContentsTest.java b/src/test/java/com/android/tools/r8/naming/AdaptResourceFileContentsTest.java
index 2d73302..0475479 100644
--- a/src/test/java/com/android/tools/r8/naming/AdaptResourceFileContentsTest.java
+++ b/src/test/java/com/android/tools/r8/naming/AdaptResourceFileContentsTest.java
@@ -163,64 +163,6 @@
   }
 
   @Test
-  public void testProguardBehavior() throws Exception {
-    Path proguardedJar =
-        File.createTempFile("proguarded", FileUtils.JAR_EXTENSION, temp.getRoot()).toPath();
-    runProguard6Raw(
-        proguardedJar,
-        ImmutableList.of(
-            AdaptResourceFileContentsTestClass.class,
-            AdaptResourceFileContentsTestClass.A.class,
-            AdaptResourceFileContentsTestClass.B.class),
-        getProguardConfig(true, null),
-        null,
-        getDataResources().stream()
-            .filter(x -> !StringUtils.toLowerCase(x.getName()).endsWith(FileUtils.CLASS_EXTENSION))
-            .collect(Collectors.toList()));
-
-    // Visit each of the resources in the jar and check that their contents are as expected.
-    Set<String> filenames = new HashSet<>();
-    ArchiveResourceProvider.fromArchive(proguardedJar, true)
-        .accept(
-            new Visitor() {
-              @Override
-              public void visit(DataDirectoryResource directory) {}
-
-              @Override
-              public void visit(DataEntryResource file) {
-                try {
-                  byte[] bytes = ByteStreams.toByteArray(file.getByteStream());
-                  List<String> lines =
-                      Arrays.asList(
-                          new String(bytes, Charset.defaultCharset())
-                              .split(System.lineSeparator()));
-                  if (file.getName().endsWith("resource-all-changed.md")) {
-                    checkAllAreChanged(lines, originalAllChangedResource);
-                  } else if (file.getName().endsWith("resource-all-changed.txt")) {
-                    checkAllAreChanged(lines, originalAllChangedResource);
-                  } else if (file.getName().endsWith("resource-all-present.txt")) {
-                    checkAllArePresent(lines, new CodeInspector(readJar(proguardedJar)));
-                  } else if (file.getName().endsWith("resource-all-unchanged.txt")) {
-                    checkAllAreUnchanged(lines, originalAllUnchangedResource);
-                  }
-                } catch (Exception e) {
-                  throw new RuntimeException(e);
-                }
-
-                // Record that the jar contains a resource with this name.
-                filenames.add(file.getName());
-              }
-            });
-
-    // Check that the jar contains the four expected resources, and nothing else.
-    assertEquals(4, filenames.size());
-    assertTrue(filenames.stream().anyMatch(x -> x.endsWith("resource-all-changed.md")));
-    assertTrue(filenames.stream().anyMatch(x -> x.endsWith("resource-all-changed.txt")));
-    assertTrue(filenames.stream().anyMatch(x -> x.endsWith("resource-all-present.txt")));
-    assertTrue(filenames.stream().anyMatch(x -> x.endsWith("resource-all-unchanged.txt")));
-  }
-
-  @Test
   public void testEnabledWithFilter() throws Exception {
     DataResourceConsumerForTesting dataResourceConsumer = new DataResourceConsumerForTesting();
     compileWithR8(getProguardConfigWithNeverInline(true, "*.md"), dataResourceConsumer);
diff --git a/src/test/java/com/android/tools/r8/naming/AdaptResourceFileNamesTest.java b/src/test/java/com/android/tools/r8/naming/AdaptResourceFileNamesTest.java
index 9abbb74..8256e47 100644
--- a/src/test/java/com/android/tools/r8/naming/AdaptResourceFileNamesTest.java
+++ b/src/test/java/com/android/tools/r8/naming/AdaptResourceFileNamesTest.java
@@ -183,71 +183,6 @@
     assertEquals(getOriginalDataResources().size(), dataResourceConsumer.size());
   }
 
-  @Test
-  public void testProguardBehavior() throws Exception {
-    Path inputJar = addDataResourcesToExistingJar(TEST_JAR, getOriginalDataResources());
-    Path proguardedJar =
-        File.createTempFile("proguarded", FileUtils.JAR_EXTENSION, temp.getRoot()).toPath();
-    Path proguardMapFile = File.createTempFile("mapping", ".txt", temp.getRoot()).toPath();
-    runProguard6Raw(proguardedJar, inputJar, getProguardConfig(true, null), proguardMapFile);
-    // Extract the names of the generated resources.
-    Set<String> filenames = new HashSet<>();
-    ArchiveResourceProvider.fromArchive(proguardedJar, true)
-        .accept(
-            new Visitor() {
-              @Override
-              public void visit(DataDirectoryResource directory) {}
-
-              @Override
-              public void visit(DataEntryResource file) {
-                filenames.add(file.getName());
-              }
-            });
-    // Check that the generated resources have the expected names.
-    ClassNameMapper mapper = ClassNameMapper.mapperFromFile(proguardMapFile);
-    for (DataEntryResource dataResource : getOriginalDataResources()) {
-      String expectedName = getExpectedRenamingFor(dataResource.getName(), mapper);
-      assertTrue(
-          "Resource not renamed to '" + expectedName + "' as expected: " + dataResource.getName(),
-          filenames.contains(expectedName));
-    }
-  }
-
-  @Test
-  public void testProguardCollisionBehavior() throws Exception {
-    List<DataEntryResource> originalDataResources = getOriginalDataResources();
-    Path inputJar =
-        addDataResourcesToExistingJar(
-            TEST_JAR,
-            ImmutableList.<DataEntryResource>builder()
-                .addAll(originalDataResources)
-                .add(
-                    DataEntryResource.fromBytes(
-                        new byte[0], "adaptresourcefilenames/b.txt", Origin.unknown()))
-                .build());
-    Path proguardedJar =
-        File.createTempFile("proguarded", FileUtils.JAR_EXTENSION, temp.getRoot()).toPath();
-    runProguard6Raw(
-        proguardedJar,
-        inputJar,
-        getProguardConfig(true, null),
-        null,
-        processResult -> {
-          assertEquals(0, processResult.exitCode);
-          assertThat(
-              processResult.stderr,
-              containsString(
-                  "Warning: can't write resource [adaptresourcefilenames/b.txt] "
-                      + "(Duplicate jar entry [adaptresourcefilenames/b.txt])"));
-        });
-    assertEquals(
-        originalDataResources.size(),
-        getDataResources(ArchiveResourceProvider.fromArchive(proguardedJar, true))
-            .stream()
-            .filter(dataResource -> !dataResource.getName().equals("META-INF/MANIFEST.MF"))
-            .count());
-  }
-
   private void compileWithR8(
       String proguardConfig,
       DataResourceConsumer dataResourceConsumer,
diff --git a/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java b/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java
index 5eb7783..7c8fdae 100644
--- a/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java
+++ b/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java
@@ -10,7 +10,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 
-import com.android.tools.r8.ProguardVersion;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.naming.keeppackagenames.Top;
@@ -82,7 +81,7 @@
 
   @Test
   public void testProguard() throws Exception {
-    testForProguard(ProguardVersion.V6_0_1)
+    testForProguard()
         .addProgramClasses(CLASSES)
         .addKeepAllClassesRuleWithAllowObfuscation()
         .addKeepRules(config.getKeepRule())
diff --git a/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java b/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java
index ec8cd72..7f09c2e 100644
--- a/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java
+++ b/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java
@@ -62,12 +62,6 @@
   }
 
   @Test
-  public void testProguard() throws Exception {
-    assumeTrue(parameters.isCfRuntime());
-    buildAndRunProguard("pg.jar");
-  }
-
-  @Test
   public void testR8() throws Exception {
     testForR8(parameters.getBackend())
         .addProgramFiles(inputJar)
@@ -90,38 +84,4 @@
             compileResult ->
                 compileResult.runDex2Oat(parameters.getRuntime()).assertNoVerificationErrors());
   }
-
-  private void buildAndRunProguard(String outName) throws Exception {
-    Path pgConfig = writeProguardRules();
-    Path outPg = temp.getRoot().toPath().resolve(outName);
-    ProcessResult proguardResult =
-        ToolHelper.runProguard6Raw(
-            inputJar, outPg, ToolHelper.getJava8RuntimeJar(), pgConfig, null);
-    System.out.println(proguardResult.stdout);
-    if (proguardResult.exitCode != 0) {
-      System.out.println(proguardResult.stderr);
-    }
-    assertEquals(0, proguardResult.exitCode);
-    ProcessResult runPg = ToolHelper.runJava(outPg, CLASS.getCanonicalName());
-    // Proguard renames IntegerInterface.inexactMethod() and ObjectInterface.inexactMethod()
-    // to different names, which causes AbstractMethodError.
-    assertNotEquals(-1, runPg.stderr.indexOf("AbstractMethodError"));
-    assertNotEquals(0, runPg.exitCode);
-  }
-
-  private Path writeProguardRules() throws IOException {
-    Path pgConfig = temp.getRoot().toPath().resolve("keep.txt");
-    FileUtils.writeTextFile(
-        pgConfig,
-        "-keep public class " + CLASS.getCanonicalName() + " {",
-        "  public static void main(...);",
-        "}",
-        "-keep interface " + CLASS.getCanonicalName() + "$ReservedNameObjectInterface1 {",
-        "  public java.lang.Object reservedMethod1();",
-        "}",
-        "-keep interface " + CLASS.getCanonicalName() + "$ReservedNameIntegerInterface2 {",
-        "  public java.lang.Integer reservedMethod2();",
-        "}");
-    return pgConfig;
-  }
 }
diff --git a/src/test/java/com/android/tools/r8/naming/adaptclassstrings/AdaptClassStringContextClassTest.java b/src/test/java/com/android/tools/r8/naming/adaptclassstrings/AdaptClassStringContextClassTest.java
index 4add73d..b2471aa 100644
--- a/src/test/java/com/android/tools/r8/naming/adaptclassstrings/AdaptClassStringContextClassTest.java
+++ b/src/test/java/com/android/tools/r8/naming/adaptclassstrings/AdaptClassStringContextClassTest.java
@@ -50,11 +50,7 @@
         .apply(this::setUpTest)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines(
-            "com.android.tools.r8.naming.adaptclassstrings.a",
-            // PG 5 replaces in both contexts despite the filter.
-            proguardVersion == ProguardVersion.V5_2_1
-                ? "com.android.tools.r8.naming.adaptclassstrings.a"
-                : typeName(Foo.class))
+            "com.android.tools.r8.naming.adaptclassstrings.a", typeName(Foo.class))
         .inspect(inspector -> assertThat(inspector.clazz(Foo.class), isPresentAndRenamed()));
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/b123068484/FieldRenamingTest.java b/src/test/java/com/android/tools/r8/naming/b123068484/FieldRenamingTest.java
index dae9881..65176e9 100644
--- a/src/test/java/com/android/tools/r8/naming/b123068484/FieldRenamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/b123068484/FieldRenamingTest.java
@@ -59,7 +59,7 @@
     parameters.assumeCfRuntime();
     Path inJar = temp.newFile("input.jar").toPath().toAbsolutePath();
     writeClassFilesToJar(inJar, CLASSES);
-    testForProguard(ProguardVersion.V6_0_1)
+    testForProguard(ProguardVersion.V7_0_0)
         .addProgramFiles(inJar)
         .addKeepMainRule(MAIN)
         .run(parameters.getRuntime(), MAIN)
diff --git a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
index 8db8492..27debc9 100644
--- a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
+++ b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
@@ -58,7 +58,6 @@
         new Shrinker[] {
           Shrinker.R8,
           Shrinker.R8_COMPAT,
-          Shrinker.PROGUARD6_THEN_D8,
           Shrinker.R8_CF,
           Shrinker.R8_COMPAT_CF
         }) {
@@ -72,9 +71,6 @@
             case R8_COMPAT:
               repackagePrefix = "rc";
               break;
-            case PROGUARD6_THEN_D8:
-              repackagePrefix = "pg";
-              break;
             case R8_CF:
               repackagePrefix = "r8cf";
               break;
@@ -156,12 +152,7 @@
     staticMethod = testClass.uniqueMethodWithOriginalName("staticMethod");
     assertThat(staticMethod, isPresent());
     assertEquals(minify, staticMethod.isRenamed());
-    boolean publicizeCondition =
-        isForceAccessModifyingPackagePrivateAndProtectedMethods()
-            || (shrinker.isProguard()
-                && minify
-                && repackagePrefix != null
-                && allowAccessModification);
+    boolean publicizeCondition = isForceAccessModifyingPackagePrivateAndProtectedMethods();
     assertEquals(publicizeCondition, staticMethod.getMethod().isPublic());
   }
 
@@ -220,12 +211,7 @@
     staticMethod = testClass.uniqueMethodWithOriginalName("staticMethod");
     assertThat(staticMethod, isPresent());
     assertEquals(minify, staticMethod.isRenamed());
-    boolean publicizeCondition =
-        isForceAccessModifyingPackagePrivateAndProtectedMethods()
-            || (shrinker.isProguard()
-                && minify
-                && repackagePrefix != null
-                && allowAccessModification);
+    boolean publicizeCondition = isForceAccessModifyingPackagePrivateAndProtectedMethods();
     assertEquals(publicizeCondition, staticMethod.getMethod().isPublic());
   }
 
@@ -287,11 +273,7 @@
     boolean publicizeCondition =
         (shrinker.isCompatR8() && allowAccessModification)
             || (shrinker.isFullModeR8()
-                && (shrinker.isR8Dex() || allowAccessModification || minify))
-            || (shrinker.isProguard()
-                && minify
-                && repackagePrefix != null
-                && allowAccessModification);
+                && (shrinker.isR8Dex() || allowAccessModification || minify));
     assertEquals(publicizeCondition, staticMethod.getMethod().accessFlags.isPublic());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/CatchAllRangeWithNoLineNumberTest.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/CatchAllRangeWithNoLineNumberTest.java
index a0ce500..65b9a20 100644
--- a/src/test/java/com/android/tools/r8/naming/retraceproguard/CatchAllRangeWithNoLineNumberTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/CatchAllRangeWithNoLineNumberTest.java
@@ -57,22 +57,6 @@
           "foo.bar.Quux -> c:",
           "  void foo():33:33 -> a");
 
-  private final String retraced5_2_1 =
-      StringUtils.lines(
-          "foo.bar.Baz.a(Baz.java)",
-          "foo.bar.Qux.a(Qux.java)",
-          "foo.bar.Quux.a(Quux.java)",
-          "foo.bar.Baz.foo(Baz.java:33)",
-          "foo.bar.Baz.a(Baz.java:0)");
-
-  private final String retraced6_0_1 =
-      StringUtils.lines(
-          "foo.bar.Baz.a(Baz.java)",
-          "foo.bar.Qux.a(Qux.java)",
-          "foo.bar.Quux.a(Quux.java)",
-          "foo.bar.Baz.foo(Baz.java:33)",
-          "foo.bar.Baz.a(Baz.java:0)");
-
   private final String retraced7_0_0 =
       StringUtils.lines(
           "foo.bar.Baz.foo(Baz.java)",
@@ -114,13 +98,6 @@
   }
 
   private String getExpected() {
-    switch (proguardVersion) {
-      case V5_2_1:
-        return retraced5_2_1;
-      case V6_0_1:
-        return retraced6_0_1;
-      default:
-        return retraced7_0_0;
-    }
+    return retraced7_0_0;
   }
 }
diff --git a/src/test/java/com/android/tools/r8/proguard/configuration/InheritanceClauseWithDisjunctionTest.java b/src/test/java/com/android/tools/r8/proguard/configuration/InheritanceClauseWithDisjunctionTest.java
index 0a3058a..1f701b4 100644
--- a/src/test/java/com/android/tools/r8/proguard/configuration/InheritanceClauseWithDisjunctionTest.java
+++ b/src/test/java/com/android/tools/r8/proguard/configuration/InheritanceClauseWithDisjunctionTest.java
@@ -5,12 +5,9 @@
 package com.android.tools.r8.proguard.configuration;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
 
-import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestShrinkerBuilder;
 import com.android.tools.r8.utils.ThrowingConsumer;
@@ -162,17 +159,10 @@
 
   @Test
   public void testImplementsClauseWithProguard() throws Exception {
-    try {
-      runTest(
-          testForProguard(),
-          getKeepRulesForImplementsClauseTests(),
-          InheritanceClauseWithDisjunctionTest::inspectImplementsClauseTests);
-      fail();
-    } catch (CompilationFailedException e) {
-      // Strangely, nothing matches implements I or J (not even InheritanceClauseWithDisjunction-
-      // TestClassIJSub, which implements both I and J!).
-      assertThat(e.getMessage(), containsString("The output jar is empty"));
-    }
+    runTest(
+        testForProguard(),
+        getKeepRulesForImplementsClauseTests(),
+        InheritanceClauseWithDisjunctionTest::inspectImplementsClauseTests);
   }
 
   private static List<String> getKeepRulesForImplementsClauseTests() {
@@ -186,9 +176,7 @@
   }
 
   private static void inspectImplementsClauseTests(CodeInspector inspector) {
-    // Strangely, nothing matches implements I or J (not even InheritanceClauseWithDisjunctionTest-
-    // ClassIJSub, which implements both I and J!).
-    assertEquals(0, inspector.allClasses().size());
+    assertEquals(3, inspector.allClasses().size());
   }
 
   @Ignore("b/128503974")
diff --git a/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java b/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java
index aa2df28..638fb0d 100644
--- a/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/AsterisksTest.java
@@ -63,7 +63,7 @@
 
   @Parameters(name = "shrinker: {0}")
   public static Collection<Object> data() {
-    return ImmutableList.of(Shrinker.PROGUARD6, Shrinker.R8, Shrinker.R8_CF);
+    return ImmutableList.of(Shrinker.R8, Shrinker.R8_CF);
   }
 
   @Test
@@ -79,10 +79,6 @@
     FieldSubject fieldSubject = classSubject.field(B111974287.class.getTypeName(), "self");
     assertThat(fieldSubject, isPresentAndNotRenamed());
     fieldSubject = classSubject.field(B111974287.class.getTypeName() + "[]", "clones");
-    // TODO(b/111974287): Proguard6 kept and renamed the field with array type.
-    if (shrinker == Shrinker.PROGUARD6) {
-      return;
-    }
     assertThat(fieldSubject, not(isPresent()));
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java b/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java
index ed80366..834649c 100644
--- a/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java
+++ b/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java
@@ -58,12 +58,6 @@
   }
 
   @Test
-  public void testProguard() throws Exception {
-    assumeTrue(parameters.isCfRuntime());
-    buildAndRunProguard("pg.jar", false);
-  }
-
-  @Test
   public void testR8() throws Exception {
     testForR8(parameters.getBackend())
         .addProgramFiles(inputJar)
@@ -79,30 +73,4 @@
             compileResult ->
                 compileResult.runDex2Oat(parameters.getRuntime()).assertNoVerificationErrors());
   }
-
-  private void buildAndRunProguard(String outName, boolean aggressive) throws Exception {
-    Path pgConfig = writeProguardRules(aggressive);
-    Path outPg = temp.getRoot().toPath().resolve(outName);
-    ProcessResult proguardResult =
-        ToolHelper.runProguard6Raw(
-            inputJar, outPg, ToolHelper.getJava8RuntimeJar(), pgConfig, null);
-    System.out.println(proguardResult.stdout);
-    if (proguardResult.exitCode != 0) {
-      System.out.println(proguardResult.stderr);
-    }
-    assertEquals(0, proguardResult.exitCode);
-    ProcessResult runPg = ToolHelper.runJava(outPg, CLASS.getCanonicalName());
-    assertEquals(0, runPg.exitCode);
-  }
-
-  private Path writeProguardRules(boolean aggressive) throws IOException {
-    Path pgConfig = temp.getRoot().toPath().resolve("keep.txt");
-    FileUtils.writeTextFile(
-        pgConfig,
-        "-keep public class " + CLASS.getCanonicalName() + " {",
-        "  public static void main(...);",
-        "}",
-        aggressive ? "-overloadaggressively" : "# Not overloading aggressively");
-    return pgConfig;
-  }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
index ad664d3..92097d3 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -1848,8 +1848,6 @@
     ProguardWildcard backReference = it2.next();
     assertTrue(backReference.isBackReference());
     assertSame(secondWildcardInIf.asPattern(), backReference.asBackReference().reference);
-
-    verifyWithProguard6(proguardConfig);
   }
 
   @Test
@@ -1873,8 +1871,6 @@
     assertEquals(1, if0.subsequentRule.getMemberRules().size());
     ProguardMemberRule fieldRule = if0.subsequentRule.getMemberRules().get(0);
     assertEquals("<1>.F<2>", fieldRule.getType().toString());
-
-    verifyWithProguard6(proguardConfig);
   }
 
   @Test
@@ -1898,8 +1894,6 @@
     assertEquals(1, if0.subsequentRule.getMemberRules().size());
     ProguardMemberRule fieldRule = if0.subsequentRule.getMemberRules().get(0);
     assertEquals("fld<2>", fieldRule.getName().toString());
-
-    verifyWithProguard6(proguardConfig);
   }
 
   @Test
@@ -1923,8 +1917,6 @@
     assertEquals(1, if0.subsequentRule.getMemberRules().size());
     ProguardMemberRule methodRule = if0.subsequentRule.getMemberRules().get(0);
     assertEquals("<1>.M<2>", methodRule.getType().toString());
-
-    verifyWithProguard6(proguardConfig);
   }
 
   @Test
@@ -1944,8 +1936,6 @@
       checkDiagnostics(
           handler.errors, proguardConfig, 5, 3, "Unexpected character", "method name");
     }
-
-    verifyFailWithProguard6(proguardConfig, "Expecting type and name instead of just '<3>'");
   }
 
   @Test
@@ -1971,8 +1961,6 @@
     assertEquals(1, if0.subsequentRule.getMemberRules().size());
     ProguardMemberRule methodRule = if0.subsequentRule.getMemberRules().get(0);
     assertEquals("<3>_delegate", methodRule.getName().toString());
-
-    verifyWithProguard6(proguardConfig);
   }
 
   @Test
@@ -1999,8 +1987,6 @@
     ProguardMemberRule methodRule = if0.subsequentRule.getMemberRules().get(0);
     assertEquals("<3>", methodRule.getType().toString());
     assertEquals("<4>", methodRule.getName().toString());
-
-    verifyWithProguard6(proguardConfig);
   }
 
   @Test
@@ -2018,7 +2004,6 @@
       checkDiagnostics(handler.errors, proguardConfig, 2, 13,
           "Use of generics not allowed for java type");
     }
-    verifyFailWithProguard6(proguardConfig, "Use of generics not allowed for java type");
   }
 
   @Test
@@ -2036,7 +2021,6 @@
       checkDiagnostics(handler.errors, proguardConfig, 2, 13,
           "Use of generics not allowed for java type");
     }
-    verifyFailWithProguard6(proguardConfig, "Use of generics not allowed for java type");
   }
 
   @Test
@@ -2051,8 +2035,6 @@
         new ProguardConfigurationParser(new DexItemFactory(), reporter);
     parser.parse(proguardConfig);
     verifyParserEndsCleanly();
-
-    verifyWithProguard6(proguardConfig);
   }
 
   @Test
@@ -2067,8 +2049,6 @@
         new ProguardConfigurationParser(new DexItemFactory(), reporter);
     parser.parse(proguardConfig);
     checkDiagnostics(handler.warnings, proguardConfig, 3, 7, "The field name \"id<<*>>\" is");
-
-    verifyWithProguard6(proguardConfig);
   }
 
   @Test
@@ -2088,7 +2068,6 @@
       checkDiagnostics(handler.errors, proguardConfig, 4, 2,
           "Wildcard", "<4>", "invalid");
     }
-    verifyFailWithProguard6(proguardConfig, "Invalid reference to wildcard (4,");
   }
 
   @Test
@@ -2106,7 +2085,6 @@
       checkDiagnostics(handler.errors, proguardConfig, 2, 13,
           "Wildcard", "<0>", "invalid");
     }
-    verifyFailWithProguard6(proguardConfig, "Invalid reference to wildcard (0,");
   }
 
   @Test
@@ -2124,7 +2102,6 @@
       checkDiagnostics(handler.errors, proguardConfig, 3, 1,
           "Wildcard", "<4>", "invalid");
     }
-    verifyFailWithProguard6(proguardConfig, "Invalid reference to wildcard (4,");
   }
 
   @Test
@@ -2142,7 +2119,6 @@
       checkDiagnostics(handler.errors, proguardConfig, 3, 1,
           "Wildcard", "<2>", "invalid");
     }
-    verifyFailWithProguard6(proguardConfig, "Invalid reference to wildcard (2,");
   }
 
   @Test
@@ -2164,7 +2140,6 @@
       checkDiagnostics(handler.errors, proguardConfig, 6, 2,
           "Wildcard", "<3>", "invalid");
     }
-    verifyFailWithProguard6(proguardConfig, "Invalid reference to wildcard (3,");
   }
 
   @Test
@@ -2184,8 +2159,6 @@
       checkDiagnostics(handler.errors, proguardConfig, 5, 1,
           "Wildcard", "<3>", "invalid");
     }
-    verifyFailWithProguard6(
-        proguardConfig, "Use of generics not allowed for java type at '<1>.<3><2>'");
   }
 
   @Test
@@ -2203,7 +2176,6 @@
       checkDiagnostics(handler.errors, proguardConfig, 1, 1,
           "Expecting", "'-keep'", "after", "'-if'");
     }
-    verifyFailWithProguard6(proguardConfig, "Expecting '-keep' option after '-if' option");
   }
 
   @Test
@@ -2220,7 +2192,6 @@
       checkDiagnostics(handler.errors, proguardConfig, 1, 1,
           "Expecting", "'-keep'", "after", "'-if'");
     }
-    verifyFailWithProguard6(proguardConfig, "Expecting '-keep' option after '-if' option");
   }
 
   @Test
@@ -2358,7 +2329,6 @@
         new ProguardConfigurationParser(new DexItemFactory(), reporter);
     parser.parse(proguardConfig);
     checkDiagnostics(handler.warnings, proguardConfig, 2, 5, "The field name \"<fields>\" is");
-    verifyWithProguard(proguardConfig);
   }
 
   @Test
@@ -2375,8 +2345,6 @@
     assertEquals(1, config.getRules().size());
     ProguardKeepRule rule = (ProguardKeepRule) config.getRules().get(0);
     assertEquals(ProguardClassType.ANNOTATION_INTERFACE, rule.getClassType());
-
-    verifyWithProguard(proguardConfig);
   }
 
   @Test
@@ -2395,8 +2363,6 @@
     checkDiagnostics(handler.warnings, 1, proguardConfig, 2, 11, "The field name \"methods>\" is");
     checkDiagnostics(handler.warnings, 2, proguardConfig, 3, 3, "The type \"<public\" is");
     checkDiagnostics(handler.warnings, 3, proguardConfig, 3, 11, "The field name \"fields>\" is");
-
-    verifyWithProguard(proguardConfig);
   }
 
   private void checkRulesSourceSnippet(List<String> sourceRules) {
@@ -2739,67 +2705,6 @@
     assertEquals(0, handler.errors.size());
   }
 
-  private void verifyWithProguard(Path proguardConfig) throws Exception {
-    if (isRunProguard()) {
-      // Add a keep rule for the test class as Proguard will fail if the resulting output jar is
-      // empty
-      Class classToKeepForTest = EmptyMainClassForProguardTests.class;
-      Path additionalProguardConfig = writeTextToTempFile(
-          "-keep class " + classToKeepForTest.getCanonicalName() + " {",
-          "  public static void main(java.lang.String[]);",
-          "}"
-      );
-      Path proguardedJar =
-          File.createTempFile("proguarded", FileUtils.JAR_EXTENSION, temp.getRoot()).toPath();
-      ProcessResult result = ToolHelper.runProguardRaw(
-          jarTestClasses(ImmutableList.of(classToKeepForTest)),
-          proguardedJar,
-          ImmutableList.of(proguardConfig, additionalProguardConfig),
-          null);
-      assertEquals(0, result.exitCode);
-      CodeInspector proguardInspector = new CodeInspector(readJar(proguardedJar));
-      assertEquals(1, proguardInspector.allClasses().size());
-    }
-  }
-
-  private void verifyWithProguard6(Path proguardConfig) throws Exception {
-    if (isRunProguard()) {
-      // Add a keep rule for the test class as Proguard will fail if the resulting output jar is
-      // empty
-      Class classToKeepForTest = EmptyMainClassForProguardTests.class;
-      Path additionalProguardConfig = writeTextToTempFile(
-          "-keep class " + classToKeepForTest.getCanonicalName() + " {",
-          "  public static void main(java.lang.String[]);",
-          "}"
-      );
-      Path proguardedJar =
-          File.createTempFile("proguarded", FileUtils.JAR_EXTENSION, temp.getRoot()).toPath();
-      ProcessResult result = ToolHelper.runProguard6Raw(
-          jarTestClasses(ImmutableList.of(classToKeepForTest)),
-          proguardedJar,
-          ImmutableList.of(proguardConfig, additionalProguardConfig),
-          null);
-      assertEquals(0, result.exitCode);
-      CodeInspector proguardInspector = new CodeInspector(readJar(proguardedJar));
-      assertEquals(1, proguardInspector.allClasses().size());
-    }
-  }
-
-  private void verifyFailWithProguard6(Path proguardConfig, String expectedMessage)
-      throws Exception{
-    if (isRunProguard()) {
-      // No need for a keep rule for this class, as we are expecting Proguard to fail with the
-      // specified message.
-      Class classForTest = EmptyMainClassForProguardTests.class;
-      Path proguardedJar =
-          File.createTempFile("proguarded", FileUtils.JAR_EXTENSION, temp.getRoot()).toPath();
-      ProcessResult result = ToolHelper.runProguard6Raw(
-          jarTestClasses(ImmutableList.of(classForTest)), proguardedJar, proguardConfig, null);
-      assertNotEquals(0, result.exitCode);
-      assertThat(result.stderr, containsString(expectedMessage));
-    }
-  }
-
   @Test
   public void b124181032() {
     // Test spaces and quotes in class name list.
@@ -2932,8 +2837,6 @@
           || initName.contains("void")) {
         continue;
       }
-      verifyFailWithProguard6(
-          proguardConfig, "Expecting type and name instead of just '" + initName + "'");
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/allowshrinking/Shrinker.java b/src/test/java/com/android/tools/r8/shaking/allowshrinking/Shrinker.java
index 112fd05..977e64b 100644
--- a/src/test/java/com/android/tools/r8/shaking/allowshrinking/Shrinker.java
+++ b/src/test/java/com/android/tools/r8/shaking/allowshrinking/Shrinker.java
@@ -9,9 +9,6 @@
 
   public static final Shrinker R8 = new Shrinker(null);
   public static final Shrinker PG = new Shrinker(ProguardVersion.getLatest());
-  public static final Shrinker PG5 = new Shrinker(ProguardVersion.V5_2_1);
-  public static final Shrinker PG6 = new Shrinker(ProguardVersion.V6_0_1);
-  public static final Shrinker PG7 = new Shrinker(ProguardVersion.V7_0_0);
 
   private final ProguardVersion proguardVersion;
 
diff --git a/src/test/java/com/android/tools/r8/shaking/constructor/InitMatchingTest.java b/src/test/java/com/android/tools/r8/shaking/constructor/InitMatchingTest.java
index 1590adf..17e8795 100644
--- a/src/test/java/com/android/tools/r8/shaking/constructor/InitMatchingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/constructor/InitMatchingTest.java
@@ -12,7 +12,6 @@
 
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.ProguardTestCompileResult;
-import com.android.tools.r8.ProguardVersion;
 import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
@@ -89,7 +88,7 @@
     ProguardTestCompileResult result;
     try {
       result =
-          testForProguard(ProguardVersion.V6_0_1)
+          testForProguard()
               .addProgramClasses(InitMatchingTestClass.class)
               .addKeepRules(createKeepRule())
               .compile();
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
index f41bf57..380a49f 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
@@ -31,7 +31,6 @@
 import com.android.tools.r8.shaking.forceproguardcompatibility.keepattributes.TestKeepAttributes;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
-import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.FieldSubject;
@@ -39,8 +38,6 @@
 import com.android.tools.r8.utils.graphinspector.GraphInspector;
 import com.android.tools.r8.utils.graphinspector.GraphInspector.QueryNode;
 import com.google.common.collect.ImmutableList;
-import java.io.File;
-import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Consumer;
@@ -178,15 +175,6 @@
         initNode.assertAbsent();
       }
     }
-
-    if (isRunProguard()) {
-      Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
-      Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
-      Path proguardMapFile = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
-      FileUtils.writeTextFile(proguardConfigFile, proguardConfig);
-      ToolHelper.runProguard(jarTestClasses(testClass),
-          proguardedJar, proguardConfigFile, proguardMapFile);
-    }
   }
 
   @Test
@@ -218,18 +206,6 @@
     if (clazz.isPresent()) {
       assertEquals(forceProguardCompatibility && containsCheckCast, !clazz.isAbstract());
     }
-
-    if (isRunProguard()) {
-      Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
-      Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
-      FileUtils.writeTextFile(proguardConfigFile, proguardConfig);
-      ToolHelper.runProguard(jarTestClasses(ImmutableList.of(mainClass, instantiatedClass)),
-          proguardedJar, proguardConfigFile, null);
-      CodeInspector proguardInspector = new CodeInspector(readJar(proguardedJar));
-      assertTrue(proguardInspector.clazz(mainClass).isPresent());
-      assertEquals(
-          containsCheckCast, proguardInspector.clazz(instantiatedClass).isPresent());
-    }
   }
 
   @Test
@@ -272,23 +248,6 @@
           assertTrue(subject.isPresent());
           assertEquals(allowObfuscation, subject.isRenamed());
         });
-
-    if (isRunProguard()) {
-      Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
-      Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
-      Path proguardMapFile = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
-      FileUtils.writeTextFile(proguardConfigFile, proguardConfig);
-      ToolHelper.runProguard(jarTestClasses(
-          ImmutableList.of(mainClass, forNameClass1, forNameClass2)),
-          proguardedJar, proguardConfigFile, proguardMapFile);
-      CodeInspector proguardedInspector = new CodeInspector(readJar(proguardedJar), proguardMapFile);
-      assertEquals(3, proguardedInspector.allClasses().size());
-      assertTrue(proguardedInspector.clazz(mainClass).isPresent());
-      for (Class<?> clazz : ImmutableList.of(forNameClass1, forNameClass2)) {
-        assertTrue(proguardedInspector.clazz(clazz).isPresent());
-        assertEquals(allowObfuscation, proguardedInspector.clazz(clazz).isRenamed());
-      }
-    }
   }
 
   @Test
@@ -332,28 +291,6 @@
         classSubject.method("java.lang.String", "bar", ImmutableList.of("java.lang.String"));
     assertTrue(bar.isPresent());
     assertEquals(allowObfuscation, bar.isRenamed());
-
-    if (isRunProguard()) {
-      Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
-      Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
-      Path proguardMapFile = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
-      FileUtils.writeTextFile(proguardConfigFile, proguardConfig);
-      ToolHelper.runProguard(jarTestClasses(
-          ImmutableList.of(mainClass, withMemberClass)),
-          proguardedJar, proguardConfigFile, proguardMapFile);
-      CodeInspector proguardedInspector = new CodeInspector(readJar(proguardedJar), proguardMapFile);
-      assertEquals(2, proguardedInspector.allClasses().size());
-      assertTrue(proguardedInspector.clazz(mainClass).isPresent());
-      classSubject = proguardedInspector.clazz(withMemberClass);
-      assertTrue(classSubject.isPresent());
-      assertEquals(allowObfuscation, classSubject.isRenamed());
-      foo = classSubject.field("java.lang.String", "foo");
-      assertTrue(foo.isPresent());
-      assertEquals(allowObfuscation, foo.isRenamed());
-      bar = classSubject.method("java.lang.String", "bar", ImmutableList.of("java.lang.String"));
-      assertTrue(bar.isPresent());
-      assertEquals(allowObfuscation, bar.isRenamed());
-    }
   }
 
   @Test
@@ -399,31 +336,6 @@
     f = classSubject.field("java.lang.Object", "objField");
     assertTrue(f.isPresent());
     assertEquals(allowObfuscation, f.isRenamed());
-
-    if (isRunProguard()) {
-      Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
-      Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
-      Path proguardMapFile = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
-      FileUtils.writeTextFile(proguardConfigFile, proguardConfig);
-      ToolHelper.runProguard(jarTestClasses(
-          ImmutableList.of(mainClass, withVolatileFields)),
-          proguardedJar, proguardConfigFile, proguardMapFile);
-      CodeInspector proguardedInspector = new CodeInspector(readJar(proguardedJar), proguardMapFile);
-      assertEquals(2, proguardedInspector.allClasses().size());
-      assertTrue(proguardedInspector.clazz(mainClass).isPresent());
-      classSubject = proguardedInspector.clazz(withVolatileFields);
-      assertTrue(classSubject.isPresent());
-      assertEquals(allowObfuscation, classSubject.isRenamed());
-      f = classSubject.field("int", "intField");
-      assertTrue(f.isPresent());
-      assertEquals(allowObfuscation, f.isRenamed());
-      f = classSubject.field("long", "longField");
-      assertTrue(f.isPresent());
-      assertEquals(allowObfuscation, f.isRenamed());
-      f = classSubject.field("java.lang.Object", "objField");
-      assertTrue(f.isPresent());
-      assertEquals(allowObfuscation, f.isRenamed());
-    }
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatibilityTestBase.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatibilityTestBase.java
index 820cc29..47a465f 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatibilityTestBase.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatibilityTestBase.java
@@ -6,21 +6,16 @@
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.fail;
 
 import com.android.tools.r8.ClassFileConsumer;
 import com.android.tools.r8.CompatProguardCommandBuilder;
-import com.android.tools.r8.DataResource;
 import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.StringConsumer;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -35,9 +30,6 @@
   protected Path proguardMap;
 
   public enum Shrinker {
-    PROGUARD5,
-    PROGUARD6,
-    PROGUARD6_THEN_D8,
     R8_COMPAT,
     R8_COMPAT_CF,
     R8,
@@ -58,26 +50,17 @@
       return this == R8_COMPAT || this == R8;
     }
 
-    public boolean isProguard() {
-      return this == PROGUARD5 || this == PROGUARD6 || this == PROGUARD6_THEN_D8;
-    }
-
     public boolean isFullModeR8() {
       return this == R8
           || this == R8_CF;
     }
 
     public boolean generatesDex() {
-      return this == PROGUARD6_THEN_D8
-          || this == R8_COMPAT
-          || this == R8;
+      return this == R8_COMPAT || this == R8;
     }
 
     public boolean generatesCf() {
-      return this == PROGUARD5
-          || this == PROGUARD6
-          || this == R8_COMPAT_CF
-          || this == R8_CF;
+      return this == R8_COMPAT_CF || this == R8_CF;
     }
 
     public Backend toBackend() {
@@ -114,12 +97,6 @@
       throws Exception {
     proguardMap = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
     switch (mode) {
-      case PROGUARD5:
-        return runProguard5(programClasses, proguardConfig, proguardMap);
-      case PROGUARD6:
-        return runProguard6(programClasses, proguardConfig, proguardMap);
-      case PROGUARD6_THEN_D8:
-        return runProguard6AndD8(programClasses, proguardConfig, proguardMap, configure);
       case R8_COMPAT:
         return runR8Compat(programClasses, proguardConfig, proguardMap, configure, Backend.DEX);
       case R8_COMPAT_CF:
@@ -154,12 +131,6 @@
       Consumer<InternalOptions> configure)
       throws Exception {
     switch (mode) {
-      case PROGUARD5:
-        return inspectProguard5Result(programClasses, proguardConfig);
-      case PROGUARD6:
-        return inspectProguard6Result(programClasses, proguardConfig);
-      case PROGUARD6_THEN_D8:
-        return inspectProguard6AndD8Result(programClasses, proguardConfig, configure);
       case R8_COMPAT:
         return inspectR8CompatResult(programClasses, proguardConfig, configure, Backend.DEX);
       case R8_COMPAT_CF:
@@ -236,130 +207,6 @@
     return new CodeInspector(runR8Compat(programClasses, proguardConfig, null, configure, backend));
   }
 
-  protected AndroidApp runProguard5(
-      List<Class<?>> programClasses, String proguardConfig, Path proguardMap) throws Exception {
-    Path proguardedJar =
-        File.createTempFile("proguarded", FileUtils.JAR_EXTENSION, temp.getRoot()).toPath();
-    Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
-    FileUtils.writeTextFile(proguardConfigFile, proguardConfig);
-    ProcessResult result = ToolHelper.runProguardRaw(
-        jarTestClasses(programClasses),
-        proguardedJar,
-        ToolHelper.getAndroidJar(AndroidApiLevel.N),
-        proguardConfigFile,
-        proguardMap);
-    if (result.exitCode != 0) {
-      fail("Proguard failed, exit code " + result.exitCode + ", stderr:\n" + result.stderr);
-    }
-    return readJar(proguardedJar);
-  }
-
-  protected CodeInspector inspectProguard5Result(
-      List<Class<?>> programClasses, String proguardConfig) throws Exception {
-    proguardMap = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
-    return new CodeInspector(
-        runProguard5(programClasses, proguardConfig, proguardMap), proguardMap);
-  }
-
-  protected ProcessResult runProguard6Raw(
-      Path destination,
-      List<Class<?>> programClasses,
-      String proguardConfig,
-      Path proguardMap,
-      List<DataResource> dataResources)
-      throws Exception {
-    return runProguard6Raw(
-        destination,
-        jarTestClasses(programClasses, dataResources),
-        proguardConfig,
-        proguardMap,
-        null);
-  }
-
-  protected ProcessResult runProguard6Raw(
-      Path destination, Path jar, String proguardConfig, Path proguardMap) throws Exception {
-    return runProguard6Raw(destination, jar, proguardConfig, proguardMap, null);
-  }
-
-  protected ProcessResult runProguard6Raw(
-      Path destination,
-      Path jar,
-      String proguardConfig,
-      Path proguardMap,
-      Consumer<ProcessResult> processResultConsumer)
-      throws Exception {
-    Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
-    FileUtils.writeTextFile(proguardConfigFile, proguardConfig);
-    ProcessResult result =
-        ToolHelper.runProguard6Raw(
-            jar,
-            destination,
-            ToolHelper.getAndroidJar(AndroidApiLevel.N),
-            proguardConfigFile,
-            proguardMap);
-    if (result.exitCode != 0) {
-      fail("Proguard failed, exit code " + result.exitCode + ", stderr:\n" + result.stderr);
-    }
-    if (processResultConsumer != null) {
-      processResultConsumer.accept(result);
-    }
-    return result;
-  }
-
-  protected AndroidApp runProguard6(
-      List<Class<?>> programClasses, String proguardConfig, Path proguardMap) throws Exception {
-    return runProguard6(programClasses, proguardConfig, proguardMap, null);
-  }
-
-  protected AndroidApp runProguard6(
-      List<Class<?>> programClasses,
-      String proguardConfig,
-      Path proguardMap,
-      List<DataResource> dataResources)
-      throws Exception {
-    Path proguardedJar =
-        File.createTempFile("proguarded", FileUtils.JAR_EXTENSION, temp.getRoot()).toPath();
-    runProguard6Raw(proguardedJar, programClasses, proguardConfig, proguardMap, dataResources);
-    return readJar(proguardedJar);
-  }
-
-  protected CodeInspector inspectProguard6Result(
-      List<Class<?>> programClasses, String proguardConfig) throws Exception {
-    proguardMap = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
-    return new CodeInspector(
-        runProguard6(programClasses, proguardConfig, proguardMap), proguardMap);
-  }
-
-  protected AndroidApp runProguard6AndD8(
-      List<Class<?>> programClasses,
-      String proguardConfig,
-      Path proguardMap,
-      Consumer<InternalOptions> configure)
-      throws Exception {
-    Path proguardedJar =
-        File.createTempFile("proguarded", FileUtils.JAR_EXTENSION, temp.getRoot()).toPath();
-    Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
-    FileUtils.writeTextFile(proguardConfigFile, proguardConfig);
-    ProcessResult result = ToolHelper.runProguard6Raw(
-        jarTestClasses(programClasses),
-        proguardedJar,
-        ToolHelper.getAndroidJar(AndroidApiLevel.N),
-        proguardConfigFile,
-        proguardMap);
-    if (result.exitCode != 0) {
-      fail("Proguard failed, exit code " + result.exitCode + ", stderr:\n" + result.stderr);
-    }
-    return ToolHelper.runD8(readJar(proguardedJar), configure);
-  }
-
-  protected CodeInspector inspectProguard6AndD8Result(
-      List<Class<?>> programClasses, String proguardConfig, Consumer<InternalOptions> configure)
-      throws Exception {
-    proguardMap = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
-    return new CodeInspector(
-        runProguard6AndD8(programClasses, proguardConfig, proguardMap, configure), proguardMap);
-  }
-
   protected void verifyClassesPresent(
       CodeInspector codeInspector, Class<?>... classesOfInterest) {
     for (Class klass : classesOfInterest) {
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ExternalizableTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ExternalizableTest.java
index 468ae54..477c205 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ExternalizableTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ExternalizableTest.java
@@ -263,7 +263,6 @@
   @Parameterized.Parameters(name = "Shrinker: {0}")
   public static Collection<Object> data() {
     return ImmutableList.of(
-        Shrinker.PROGUARD6_THEN_D8, Shrinker.PROGUARD6,
         Shrinker.R8_COMPAT, Shrinker.R8_COMPAT_CF,
         Shrinker.R8, Shrinker.R8_CF);
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
index 1d62f64..114796c 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
@@ -148,28 +148,11 @@
       Class<?> mainClass,
       List<Class<?>> programClasses,
       String proguardConfiguration,
-      TriConsumer<Class, List<Class<?>>, CodeInspector> r8Checker,
-      TriConsumer<Class, List<Class<?>>, CodeInspector> proguardChecker)
+      TriConsumer<Class, List<Class<?>>, CodeInspector> r8Checker)
       throws Exception {
     CodeInspector inspector =
         inspectR8CompatResult(programClasses, proguardConfiguration, null, parameters.getBackend());
     r8Checker.accept(mainClass, programClasses, inspector);
-
-    if (isRunProguard()) {
-      inspector = inspectProguard6Result(programClasses, proguardConfiguration);
-      proguardChecker.accept(mainClass, programClasses, inspector);
-      inspector = inspectProguard6AndD8Result(programClasses, proguardConfiguration, null);
-      proguardChecker.accept(mainClass, programClasses, inspector);
-    }
-  }
-
-  private void runTest(
-      Class<?> mainClass,
-      List<Class<?>> programClasses,
-      String proguardConfiguration,
-      TriConsumer<Class, List<Class<?>>, CodeInspector> checker)
-      throws Exception {
-    runTest(mainClass, programClasses, proguardConfiguration, checker, checker);
   }
 
   @Test
@@ -293,7 +276,6 @@
         mainClass,
         ImmutableList.of(mainClass, StaticFieldNotInitialized.class),
         keepMainProguardConfiguration(mainClass),
-        this::checkOnlyMainPresent,
         this::checkOnlyMainPresent);
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
index 7af5d20..1820202 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
@@ -9,7 +9,6 @@
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeFalse;
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestShrinkerBuilder;
@@ -42,8 +41,7 @@
   @Parameters(name = "{0}, shrinker: {1}")
   public static Collection<Object[]> data() {
     return buildParameters(
-        getTestParameters().withAllRuntimesAndApiLevels().build(),
-        ImmutableList.of(Shrinker.PROGUARD6, Shrinker.R8));
+        getTestParameters().withAllRuntimesAndApiLevels().build(), ImmutableList.of(Shrinker.R8));
   }
 
   private TestShrinkerBuilder<?, ?, ?, ?, ?> getTestBuilder() {
@@ -52,9 +50,6 @@
 
   private TestShrinkerBuilder<?, ?, ?, ?, ?> getTestBuilder(boolean allowDiagnosticInfoMessages) {
     switch (shrinker) {
-      case PROGUARD6:
-        assertTrue(parameters.isCfRuntime());
-        return testForProguard().addInliningAnnotations().addNeverClassInliningAnnotations();
       case R8:
         return testForR8(parameters.getBackend())
             .allowUnusedProguardConfigurationRules(allowDiagnosticInfoMessages)
@@ -67,8 +62,6 @@
 
   @Test
   public void ifOnPublic_noPublicClassForIfRule() throws Exception {
-    assumeFalse(shrinker.isProguard() && parameters.isDexRuntime());
-
     getTestBuilder(shrinker.isR8())
         .addProgramClasses(CLASSES)
         .addKeepRules(
@@ -101,8 +94,6 @@
 
   @Test
   public void ifOnNonPublic_keepOnPublic() throws Exception {
-    assumeFalse(shrinker.isProguard() && parameters.isDexRuntime());
-
     getTestBuilder()
         .addProgramClasses(CLASSES)
         .addKeepRules(
@@ -141,8 +132,6 @@
 
   @Test
   public void ifOnNonPublic_keepOnNonPublic() throws Exception {
-    assumeFalse(shrinker.isProguard() && parameters.isDexRuntime());
-
     getTestBuilder()
         .addProgramClasses(CLASSES)
         .addKeepRules(
@@ -186,8 +175,6 @@
 
   @Test
   public void ifOnPublic_keepOnPublic() throws Exception {
-    assumeFalse(shrinker.isProguard() && parameters.isDexRuntime());
-
     getTestBuilder()
         .addProgramClasses(CLASSES)
         .addKeepRules(
@@ -225,8 +212,6 @@
 
   @Test
   public void ifOnPublic_keepOnNonPublic() throws Exception {
-    assumeFalse(shrinker.isProguard() && parameters.isDexRuntime());
-
     getTestBuilder()
         .addProgramClasses(CLASSES)
         .addKeepRules(
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java
index dfe70d5..dae9af6 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java
@@ -29,7 +29,7 @@
 
   @Parameters(name = "shrinker: {0}")
   public static Collection<Object> data() {
-    return ImmutableList.of(Shrinker.PROGUARD6, Shrinker.R8, Shrinker.R8_CF);
+    return ImmutableList.of(Shrinker.R8, Shrinker.R8_CF);
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
index 39ec9a9..a646cc9 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
@@ -48,8 +48,6 @@
   @Parameters(name = "shrinker: {0} precondition: {1}")
   public static Collection<Object[]> data() {
     return ImmutableList.of(
-        new Object[] {Shrinker.PROGUARD6, true},
-        new Object[] {Shrinker.PROGUARD6, false},
         new Object[] {Shrinker.R8, true},
         new Object[] {Shrinker.R8, false},
         new Object[] {Shrinker.R8_CF, true},
@@ -78,18 +76,6 @@
         programClasses, adaptConfiguration(proguardConfig), configure, backend);
   }
 
-  @Override
-  protected CodeInspector inspectProguard5Result(
-      List<Class<?>> programClasses, String proguardConfig) throws Exception {
-    return super.inspectProguard5Result(programClasses, adaptConfiguration(proguardConfig));
-  }
-
-  @Override
-  protected CodeInspector inspectProguard6Result(
-      List<Class<?>> programClasses, String proguardConfig) throws Exception {
-    return super.inspectProguard6Result(programClasses, adaptConfiguration(proguardConfig));
-  }
-
   @Test
   public void ifThenKeep_withoutNthWildcard() throws Exception {
     List<String> config = ImmutableList.of(
@@ -101,10 +87,6 @@
 
     CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config);
     if (!keepPrecondition) {
-      // TODO(b/73708139): Proguard6 kept Dependent (w/o any members), which is not necessary.
-      if (shrinker == Shrinker.PROGUARD6) {
-        return;
-      }
       assertEquals(1, codeInspector.allClasses().size());
       return;
     }
@@ -138,10 +120,6 @@
 
     CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config);
     if (!keepPrecondition) {
-      // TODO(b/73708139): Proguard6 kept Dependent (w/o any members), which is not necessary.
-      if (shrinker == Shrinker.PROGUARD6) {
-        return;
-      }
       assertEquals(1, codeInspector.allClasses().size());
       return;
     }
@@ -214,10 +192,6 @@
 
     CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config);
     if (!keepPrecondition) {
-      // TODO(b/73708139): Proguard6 kept DependentUser (w/o any members), which is not necessary.
-      if (shrinker == Shrinker.PROGUARD6) {
-        return;
-      }
       assertEquals(1, codeInspector.allClasses().size());
       return;
     }
@@ -263,10 +237,6 @@
 
     CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config);
     if (!keepPrecondition) {
-      // TODO(b/73708139): Proguard6 kept DependentUser (w/o any members), which is not necessary.
-      if (shrinker == Shrinker.PROGUARD6) {
-        return;
-      }
       assertEquals(1, codeInspector.allClasses().size());
       return;
     }
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java
index 6665646..afb1807 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java
@@ -43,7 +43,7 @@
 
   @Parameters(name = "shrinker: {0}")
   public static Collection<Object> data() {
-    return ImmutableList.of(Shrinker.PROGUARD6, Shrinker.R8, Shrinker.R8_CF);
+    return ImmutableList.of(Shrinker.R8, Shrinker.R8_CF);
   }
 
   private String adaptConfiguration(String proguardConfig) {
@@ -64,12 +64,6 @@
         programClasses, adaptConfiguration(proguardConfig), config, backend);
   }
 
-  @Override
-  protected CodeInspector inspectProguard6Result(
-      List<Class<?>> programClasses, String proguardConfig) throws Exception {
-    return super.inspectProguard6Result(programClasses, adaptConfiguration(proguardConfig));
-  }
-
   @Test
   public void ifOnField_withoutNthWildcard() throws Exception {
     List<String> config = ImmutableList.of(
diff --git a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java
index ba6034d..90f2212 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java
@@ -39,8 +39,7 @@
       CodeInspector inspector,
       Class<?> mainClass,
       Class<?> staticClass,
-      boolean forceProguardCompatibility,
-      boolean fromProguard) {
+      boolean forceProguardCompatibility) {
     assertTrue(inspector.clazz(mainClass).isPresent());
     ClassSubject staticClassSubject = inspector.clazz(staticClass);
     assertThat(staticClassSubject, isPresent());
@@ -55,18 +54,11 @@
     MethodSubject getIMethod = staticClassSubject.method("int", "getI", ImmutableList.of());
     FieldSubject iField = staticClassSubject.field("int", "i");
     if (forceProguardCompatibility) {
-      if (fromProguard) {
-        // Proguard keeps the instance method and it code even though the class does not have a
-        // constructor, and therefore cannot be instantiated.
-        assertThat(getIMethod, isPresent());
-        assertThat(iField, isPresent());
-      } else {
-        // Force Proguard compatibility keeps the instance method, even though the class does
-        // not have a constructor.
-        assertThat(getIMethod, not(isAbstract()));
-        // As the method is abstract the referenced field is not present.
-        assertThat(iField, not(isPresent()));
-      }
+      // Force Proguard compatibility keeps the instance method, even though the class does
+      // not have a constructor.
+      assertThat(getIMethod, not(isAbstract()));
+      // As the method is abstract the referenced field is not present.
+      assertThat(iField, not(isPresent()));
     } else {
       assertThat(getIMethod, not(isPresent()));
       assertThat(iField, not(isPresent()));
@@ -77,8 +69,6 @@
 
   private void runTest(Class<?> mainClass, Class<?> staticClass, boolean forceProguardCompatibility)
       throws Exception {
-    String proguardConfig = String.join("\n", ImmutableList.of(
-    ));
     CodeInspector inspector;
     inspector =
         testForR8Compat(parameters.getBackend(), forceProguardCompatibility)
@@ -94,12 +84,7 @@
             .setMinApi(parameters)
             .compile()
             .inspector();
-    check(inspector, mainClass, staticClass, forceProguardCompatibility, false);
-
-    if (isRunProguard()) {
-      inspector = inspectProguard6Result(ImmutableList.of(mainClass, staticClass), proguardConfig);
-      check(inspector, mainClass, staticClass, true, true);
-    }
+    check(inspector, mainClass, staticClass, forceProguardCompatibility);
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java
index 45c7a00..0ba674b 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java
@@ -71,8 +71,7 @@
 
   @Parameters(name = "shrinker: {0}")
   public static Collection<Object> data() {
-    return ImmutableList.of(
-        Shrinker.PROGUARD6, Shrinker.R8_COMPAT, Shrinker.R8_COMPAT_CF, Shrinker.R8, Shrinker.R8_CF);
+    return ImmutableList.of(Shrinker.R8_COMPAT, Shrinker.R8_COMPAT_CF, Shrinker.R8, Shrinker.R8_CF);
   }
 
   public B115867670(Shrinker shrinker) {
diff --git a/src/test/testbase/java/com/android/tools/r8/ProguardVersion.java b/src/test/testbase/java/com/android/tools/r8/ProguardVersion.java
index 28f0cf6..5d75149 100644
--- a/src/test/testbase/java/com/android/tools/r8/ProguardVersion.java
+++ b/src/test/testbase/java/com/android/tools/r8/ProguardVersion.java
@@ -10,8 +10,6 @@
 import java.nio.file.Paths;
 
 public enum ProguardVersion {
-  V5_2_1("5.2.1"),
-  V6_0_1("6.0.1"),
   V7_0_0("7.0.0"),
   V7_3_2("7.3.2"),
   V7_4_1("7.4.1");
diff --git a/src/test/testbase/java/com/android/tools/r8/TestBase.java b/src/test/testbase/java/com/android/tools/r8/TestBase.java
index ae4cdc9..b9bb920 100644
--- a/src/test/testbase/java/com/android/tools/r8/TestBase.java
+++ b/src/test/testbase/java/com/android/tools/r8/TestBase.java
@@ -408,7 +408,7 @@
   /** @deprecated use {@link #testForProguard(ProguardVersion)} instead. */
   @Deprecated
   public ProguardTestBuilder testForProguard() {
-    return testForProguard(ProguardVersion.V6_0_1);
+    return testForProguard(ProguardVersion.V7_0_0);
   }
 
   public ProguardTestBuilder testForProguard(ProguardVersion version) {
diff --git a/src/test/testbase/java/com/android/tools/r8/ToolHelper.java b/src/test/testbase/java/com/android/tools/r8/ToolHelper.java
index 5aae024..654fc9a 100644
--- a/src/test/testbase/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/testbase/java/com/android/tools/r8/ToolHelper.java
@@ -242,11 +242,6 @@
   public static final String JDK_11_TESTS_DIR = OPEN_JDK_DIR + "jdk-11-test/";
   public static final String JDK_11_TIME_TESTS_DIR = JDK_11_TESTS_DIR + "java/time/";
 
-  private static final String PROGUARD5_2_1 =
-      THIRD_PARTY_DIR + "proguard/proguard5.2.1/bin/proguard";
-  private static final String PROGUARD6_0_1 =
-      THIRD_PARTY_DIR + "proguard/proguard6.0.1/bin/proguard";
-  private static final String PROGUARD = PROGUARD5_2_1;
   public static final Path JACOCO_ROOT = Paths.get(THIRD_PARTY_DIR, "jacoco", "0.8.6");
   public static final Path JACOCO_AGENT = JACOCO_ROOT.resolve(Paths.get("lib", "jacocoagent.jar"));
   public static final Path JACOCO_CLI = JACOCO_ROOT.resolve(Paths.get("lib", "jacococli.jar"));
@@ -1174,20 +1169,6 @@
     return ""; //never here
   }
 
-  public static String getProguard5Script() {
-    if (isWindows()) {
-      return PROGUARD + ".bat";
-    }
-    return PROGUARD + ".sh";
-  }
-
-  public static String getProguard6Script() {
-    if (isWindows()) {
-      return PROGUARD6_0_1 + ".bat";
-    }
-    return PROGUARD6_0_1 + ".sh";
-  }
-
   public static Backend[] getBackends() {
     if (getDexVm() == DexVm.ART_DEFAULT) {
       return Backend.values();
@@ -2561,41 +2542,6 @@
     return result.stdout;
   }
 
-  public static ProcessResult runProguardRaw(
-      Path inJar, Path outJar, Path lib, Path config, Path map) throws IOException {
-    return runProguardRaw(getProguard5Script(), inJar, outJar, lib, ImmutableList.of(config), map);
-  }
-
-  public static ProcessResult runProguardRaw(Path inJar, Path outJar, List<Path> config, Path map)
-      throws IOException {
-    return runProguardRaw(getProguard5Script(), inJar, outJar, config, map);
-  }
-
-  public static String runProguard(Path inJar, Path outJar, Path config, Path map)
-      throws IOException {
-    return runProguard(inJar, outJar, ImmutableList.of(config), map);
-  }
-
-  public static String runProguard(Path inJar, Path outJar, List<Path> config, Path map)
-      throws IOException {
-    return runProguard(getProguard5Script(), inJar, outJar, config, map);
-  }
-
-  public static ProcessResult runProguard6Raw(Path inJar, Path outJar, Path config, Path map)
-      throws IOException {
-    return runProguardRaw(getProguard6Script(), inJar, outJar, ImmutableList.of(config), map);
-  }
-
-  public static ProcessResult runProguard6Raw(
-      Path inJar, Path outJar, List<Path> config, Path map) throws IOException {
-    return runProguardRaw(getProguard6Script(), inJar, outJar, config, map);
-  }
-
-  public static ProcessResult runProguard6Raw(
-      Path inJar, Path outJar, Path lib, Path config, Path map) throws IOException {
-    return runProguardRaw(getProguard6Script(), inJar, outJar, lib, ImmutableList.of(config), map);
-  }
-
   public static ProcessResult runRetraceRaw(Path retracePath, Path map, Path stackTrace)
       throws IOException {
     List<String> command = new ArrayList<>();
diff --git a/third_party/proguard/README.google b/third_party/proguard/README.google
index 4449832..4501b28 100644
--- a/third_party/proguard/README.google
+++ b/third_party/proguard/README.google
@@ -1,11 +1,9 @@
-URL: https://sourceforge.net/projects/proguard/files/proguard/5.2/
-URL: https://sourceforge.net/projects/proguard/files/proguard/6.0/
 URL: https://github.com/Guardsquare/proguard/releases/download/v7.0.0/proguard-7.0.0.tar.gz
 URL: https://github.com/Guardsquare/proguard/releases/download/v7.3.2/proguard-7.3.2.tar.gz
 URL: https://github.com/Guardsquare/proguard/releases/download/v7.4.1/proguard-7.4.1.tar.gz
-Version: 5.2.1, 6.0.1, 7.0.0, 7.3.2, 7.4.1
+Version: 7.0.0, 7.3.2, 7.4.1
 License: GPL
-License File: proguard5.2.1/docs/license.html, proguard6.0.1/docs/license.html, proguard-7.0.0/docs/license.md, proguard-7.3.2/LICENSE, proguard-7.4.1/LICENSE
+License File: proguard-7.0.0/docs/license.md, proguard-7.3.2/LICENSE, proguard-7.4.1/LICENSE
 
 Description:
 ProGuard Java Optimizer and Obfuscator
diff --git a/third_party/proguard/proguard5.2.1.tar.gz.sha1 b/third_party/proguard/proguard5.2.1.tar.gz.sha1
deleted file mode 100644
index 6a14533..0000000
--- a/third_party/proguard/proguard5.2.1.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-aeed6fcb9b2979da03679448d701e9310227aa01
\ No newline at end of file
diff --git a/third_party/proguard/proguard6.0.1.tar.gz.sha1 b/third_party/proguard/proguard6.0.1.tar.gz.sha1
deleted file mode 100644
index e5e8e3c..0000000
--- a/third_party/proguard/proguard6.0.1.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-ef075c414299327dae5f96cce539422dc9088946
\ No newline at end of file
diff --git a/tools/proguard.py b/tools/proguard.py
index 312533e..2b45fb0 100755
--- a/tools/proguard.py
+++ b/tools/proguard.py
@@ -15,13 +15,9 @@
 # Internal constants, these should not be used outside this script.
 # Use the friendly utility methods below.
 PG_DIR = os.path.join(utils.THIRD_PARTY, 'proguard')
-DEFAULT = 'pg6'
+DEFAULT = 'pg7'
 DEFAULT_ALIAS = 'pg'
 VERSIONS = {
-    'pg5':
-        os.path.join(PG_DIR, 'proguard5.2.1', 'lib', 'proguard.jar'),
-    'pg6':
-        os.path.join(PG_DIR, 'proguard6.0.1', 'lib', 'proguard.jar'),
     'pg7':
         os.path.join(PG_DIR, 'proguard-7.0.0', 'lib', 'proguard.jar'),
     'pg_internal':
