diff --git a/src/main/java/com/android/tools/r8/PrintUses.java b/src/main/java/com/android/tools/r8/PrintUses.java
index 80b5ec7..d7310e5 100644
--- a/src/main/java/com/android/tools/r8/PrintUses.java
+++ b/src/main/java/com/android/tools/r8/PrintUses.java
@@ -584,7 +584,7 @@
 
     @Override
     void printPackageNames(List<String> packageNames) {
-      append("-keeppackagenames " + StringUtils.join(packageNames, ",") + "\n");
+      append("-keeppackagenames " + StringUtils.join(",", packageNames) + "\n");
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java b/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java
index d56b873..bc57c25 100644
--- a/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java
+++ b/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java
@@ -452,7 +452,7 @@
 
   @Override
   public void print(CfFrame frame) {
-    String keys = join(frame.getLocals().keySet(), ",");
+    String keys = join(",", frame.getLocals().keySet());
     String values = join(",", frame.getLocals().values(), this::frameTypeType);
     String stack = join(",", frame.getStack(), this::frameTypeType);
     printNewInstruction(
diff --git a/src/main/java/com/android/tools/r8/errors/DuplicateTypesDiagnostic.java b/src/main/java/com/android/tools/r8/errors/DuplicateTypesDiagnostic.java
index 1c35883..6aa7234 100644
--- a/src/main/java/com/android/tools/r8/errors/DuplicateTypesDiagnostic.java
+++ b/src/main/java/com/android/tools/r8/errors/DuplicateTypesDiagnostic.java
@@ -64,6 +64,6 @@
   @Override
   public String getDiagnosticMessage() {
     String typeName = DescriptorUtils.descriptorToJavaType(type.getDescriptor());
-    return "Type " + typeName + " is defined multiple times: " + StringUtils.join(origins, ", ");
+    return "Type " + typeName + " is defined multiple times: " + StringUtils.join(", ", origins);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index 506e8af..0995f34 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -973,7 +973,7 @@
                   || !v.hasDebugUsers()
                   || v.debugUsers().stream().anyMatch(i -> !i.isAssume())
                   || v.numberOfPhiUsers() > 0
-              : StringUtils.join(v.uniqueUsers(), System.lineSeparator());
+              : StringUtils.join(System.lineSeparator(), v.uniqueUsers());
           return true;
         };
     return verifySSATypeLattice(wrapSSAVerifierWithStackValueHandling(verifyValue));
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
index df06045..411e7a8 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
@@ -108,11 +108,10 @@
   public boolean noUpdatesLeft() {
     assert appInfoWithLivenessModifier.isEmpty();
     assert fieldOptimizationInfos.isEmpty()
-        : StringUtils.join(fieldOptimizationInfos.keySet(), ", ");
+        : StringUtils.join(", ", fieldOptimizationInfos.keySet());
     assert methodOptimizationInfos.isEmpty()
-        : StringUtils.join(methodOptimizationInfos.keySet(), ", ");
-    assert processed.isEmpty()
-        : StringUtils.join(processed.keySet(), ", ");
+        : StringUtils.join(", ", methodOptimizationInfos.keySet());
+    assert processed.isEmpty() : StringUtils.join(", ", processed.keySet());
     return true;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java
index 6fa0363..6335e27 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java
@@ -85,7 +85,7 @@
     List<String> strings = new ArrayList<>();
     infos.forEach((field, info) -> strings.add(field.toSourceString() + " -> " + info));
     return "NonTrivialInstanceFieldInitializationInfoCollection("
-        + StringUtils.join(strings, "; ")
+        + StringUtils.join("; ", strings)
         + ")";
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporterImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporterImpl.java
index ee2d4b5..257cc15 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporterImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/WhyAreYouNotInliningReporterImpl.java
@@ -147,7 +147,7 @@
         "not a valid inlining reason (was: "
             + reason
             + ", allowed: one of "
-            + StringUtils.join(validInliningReasons, ", ")
+            + StringUtils.join(", ", validInliningReasons)
             + ").");
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOptimizer.java
index 5fdaf51..ca49a7d 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderOptimizer.java
@@ -540,7 +540,7 @@
       if (contents == null || contents.isEmpty()) {
         return;
       }
-      String result = StringUtils.join(contents, "");
+      String result = StringUtils.join("", contents);
       Integer size = Integer.valueOf(contents.size());
       Integer length = Integer.valueOf(result.length());
       if (isPartial) {
@@ -712,7 +712,7 @@
           builder, optimizationConfiguration)) {
         return null;
       }
-      String result = StringUtils.join(contents, "");
+      String result = StringUtils.join("", contents);
       int estimate = estimateSizeReduction(contents);
       return estimate > result.length() ? result : null;
     }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
index ca1d394..fbfb3bb 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
@@ -110,7 +110,7 @@
       KotlinClassMetadata.MultiFileClassFacade kMetadata, String indent) {
     return indent
         + "MetaData.MultiFileClassFacade("
-        + StringUtils.join(kMetadata.getPartClassNames(), ", ")
+        + StringUtils.join(", ", kMetadata.getPartClassNames())
         + ")";
   }
 
@@ -327,16 +327,16 @@
         });
     String companionObject = kmClass.getCompanionObject();
     appendKeyValue(
-        indent, "enumEntries", sb, "[" + StringUtils.join(kmClass.getEnumEntries(), ",") + "]");
+        indent, "enumEntries", sb, "[" + StringUtils.join(",", kmClass.getEnumEntries()) + "]");
     appendKeyValue(
         indent, "companionObject", sb, companionObject == null ? "null" : companionObject);
     appendKeyValue(
         indent,
         "sealedSubclasses",
         sb,
-        "[" + StringUtils.join(kmClass.getSealedSubclasses(), ",") + "]");
+        "[" + StringUtils.join(",", kmClass.getSealedSubclasses()) + "]");
     appendKeyValue(
-        indent, "nestedClasses", sb, "[" + StringUtils.join(kmClass.getNestedClasses(), ",") + "]");
+        indent, "nestedClasses", sb, "[" + StringUtils.join(",", kmClass.getNestedClasses()) + "]");
     appendKeyValue(
         indent,
         "anonymousObjectOriginName",
diff --git a/src/main/java/com/android/tools/r8/references/MethodReference.java b/src/main/java/com/android/tools/r8/references/MethodReference.java
index 9ff0649..fc8f183 100644
--- a/src/main/java/com/android/tools/r8/references/MethodReference.java
+++ b/src/main/java/com/android/tools/r8/references/MethodReference.java
@@ -77,7 +77,7 @@
 
   public String getMethodDescriptor() {
     return StringUtils.join(
-            ListUtils.map(getFormalTypes(), TypeReference::getDescriptor), "", BraceType.PARENS)
+            "", ListUtils.map(getFormalTypes(), TypeReference::getDescriptor), BraceType.PARENS)
         + (getReturnType() == null ? "V" : getReturnType().getDescriptor());
   }
 
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java b/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java
index 1b80a1e..df5bdd1 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java
@@ -415,7 +415,7 @@
       case INIT: {
         result.append(getName());
         result.append('(');
-        result.append(StringUtils.join(getArguments(), ","));
+          result.append(StringUtils.join(",", getArguments()));
         result.append(')');
         break;
       }
diff --git a/src/main/java/com/android/tools/r8/shaking/WhyAreYouKeepingConsumer.java b/src/main/java/com/android/tools/r8/shaking/WhyAreYouKeepingConsumer.java
index d56e455..1099f62 100644
--- a/src/main/java/com/android/tools/r8/shaking/WhyAreYouKeepingConsumer.java
+++ b/src/main/java/com/android/tools/r8/shaking/WhyAreYouKeepingConsumer.java
@@ -211,8 +211,8 @@
           + '.'
           + method.getMethodName()
           + StringUtils.join(
-              ListUtils.map(method.getFormalTypes(), TypeReference::getTypeName),
               ",",
+              ListUtils.map(method.getFormalTypes(), TypeReference::getTypeName),
               BraceType.PARENS);
     }
     if (node instanceof FieldGraphNode) {
diff --git a/src/main/java/com/android/tools/r8/tracereferences/KeepRuleFormatter.java b/src/main/java/com/android/tools/r8/tracereferences/KeepRuleFormatter.java
index c28ef5d..b768c52 100644
--- a/src/main/java/com/android/tools/r8/tracereferences/KeepRuleFormatter.java
+++ b/src/main/java/com/android/tools/r8/tracereferences/KeepRuleFormatter.java
@@ -73,7 +73,7 @@
   @Override
   protected void printPackageNames(List<String> packageNames) {
     if (!packageNames.isEmpty()) {
-      append("-keeppackagenames " + StringUtils.join(packageNames, ",") + System.lineSeparator());
+      append("-keeppackagenames " + StringUtils.join(",", packageNames) + System.lineSeparator());
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApp.java b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
index d1f6e4c..d58387f 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApp.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
@@ -510,7 +510,7 @@
         for (String mainDexClass : getMainDexClasses()) {
           mainDexList.add(mainDexClass.replace(".", "/") + CLASS_EXTENSION);
         }
-        String join = StringUtils.join(mainDexList, "\n");
+        String join = StringUtils.join("\n", mainDexList);
         writeToZipStream(out, dumpMainDexListResourceFileName, join.getBytes(), ZipEntry.DEFLATED);
       }
       if (options.hasMainDexKeepRules()) {
diff --git a/src/main/java/com/android/tools/r8/utils/StringUtils.java b/src/main/java/com/android/tools/r8/utils/StringUtils.java
index 8f398ac..9be7a5e 100644
--- a/src/main/java/com/android/tools/r8/utils/StringUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/StringUtils.java
@@ -124,20 +124,20 @@
     return builder;
   }
 
-  public static <T> String join(Collection<T> collection, String separator) {
-    return join(collection, separator, BraceType.NONE);
+  public static String join(String separator, String... strings) {
+    return join(separator, Arrays.asList(strings));
+  }
+
+  public static <T> String join(String separator, Iterable<T> iterable) {
+    return join(separator, iterable, BraceType.NONE);
   }
 
   public static <T> String join(String separator, Iterable<T> iterable, Function<T, String> fn) {
     return join(separator, iterable, fn, BraceType.NONE);
   }
 
-  public static String join(String separator, String... strings) {
-    return join(Arrays.asList(strings), separator, BraceType.NONE);
-  }
-
-  public static <T> String join(Collection<T> collection, String separator, BraceType brace) {
-    return join(separator, collection, Object::toString, brace);
+  public static <T> String join(String separator, Iterable<T> iterable, BraceType brace) {
+    return join(separator, iterable, Object::toString, brace);
   }
 
   public static <T> String join(
@@ -174,7 +174,7 @@
   }
 
   public static <T> String joinLines(Collection<T> collection) {
-    return join(collection, LINE_SEPARATOR, BraceType.NONE);
+    return join(LINE_SEPARATOR, collection, BraceType.NONE);
   }
 
   public static List<String> splitLines(String content) {
diff --git a/src/test/java/com/android/tools/r8/DeviceRunner.java b/src/test/java/com/android/tools/r8/DeviceRunner.java
index c68c8f2..fb46cfd 100644
--- a/src/test/java/com/android/tools/r8/DeviceRunner.java
+++ b/src/test/java/com/android/tools/r8/DeviceRunner.java
@@ -167,7 +167,8 @@
       throw new DeviceRunnerConfigurationException(
           "Running tests on more than one device is not yet supported. "
               + "Currently connected devices: ["
-              + StringUtils.join(Arrays.asList(connectedDevices), ",") + "]");
+              + StringUtils.join(",", Arrays.asList(connectedDevices))
+              + "]");
     }
 
     int exitStatus = -1;
diff --git a/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithSelfReferenceTestRunner.java b/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithSelfReferenceTestRunner.java
index 477af87..409d776 100644
--- a/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithSelfReferenceTestRunner.java
+++ b/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithSelfReferenceTestRunner.java
@@ -178,8 +178,8 @@
         DisassembleCommand.builder().addProgramFiles(out1).setOutputPath(dissasemble1).build());
     Disassemble.disassemble(
         DisassembleCommand.builder().addProgramFiles(out2).setOutputPath(dissasemble2).build());
-    String content1 = StringUtils.join(Files.readAllLines(dissasemble1), "\n");
-    String content2 = StringUtils.join(Files.readAllLines(dissasemble2), "\n");
+    String content1 = StringUtils.join("\n", Files.readAllLines(dissasemble1));
+    String content2 = StringUtils.join("\n", Files.readAllLines(dissasemble2));
     assertEquals(content1, content2);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/jasmin/JasminBuilder.java b/src/test/java/com/android/tools/r8/jasmin/JasminBuilder.java
index 23c4628..7f41f05 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JasminBuilder.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JasminBuilder.java
@@ -213,9 +213,14 @@
         String returnType,
         String... lines) {
       StringBuilder builder = new StringBuilder();
-      builder.append(".method ").append(access).append(" ").append(name)
-          .append(StringUtils.join(argumentTypes, "", BraceType.PARENS))
-          .append(returnType).append("\n");
+      builder
+          .append(".method ")
+          .append(access)
+          .append(" ")
+          .append(name)
+          .append(StringUtils.join("", argumentTypes, BraceType.PARENS))
+          .append(returnType)
+          .append("\n");
       for (String line : lines) {
         builder.append(line).append("\n");
       }
@@ -382,7 +387,7 @@
       }
       builder
           .append(name)
-          .append(StringUtils.join(argumentTypes, "", BraceType.PARENS))
+          .append(StringUtils.join("", argumentTypes, BraceType.PARENS))
           .append(returnType)
           .append(System.lineSeparator());
       builder.append(".limit locals ").append(localsLimit).append(System.lineSeparator());
diff --git a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
index ab2d643..73f7a6f 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
@@ -219,7 +219,7 @@
     List<String> args = new ArrayList<>();
     args.add("--output=" + dex.toString());
     args.add(classes.toString());
-    System.out.println("running: dx " + StringUtils.join(args, " "));
+    System.out.println("running: dx " + StringUtils.join(" ", args));
     return ToolHelper.runDX(args.toArray(new String[args.size()]));
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
index 668206c..1f7101b 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
@@ -69,8 +69,8 @@
       return new StackTrace(
           stackTraceLines,
           StringUtils.join(
-              stackTraceLines.stream().map(StackTraceLine::toString).collect(Collectors.toList()),
-              "\n"));
+              "\n",
+              stackTraceLines.stream().map(StackTraceLine::toString).collect(Collectors.toList())));
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageTestBase.java b/src/test/java/com/android/tools/r8/repackage/RepackageTestBase.java
index 9a1ad72..788bb0a 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageTestBase.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageTestBase.java
@@ -125,7 +125,7 @@
         if (isFlattenPackageHierarchy()) {
           expectedPackageNames.add(packageName != null ? packageName : "a");
         }
-        return StringUtils.join(expectedPackageNames, ".");
+        return StringUtils.join(".", expectedPackageNames);
       }
     };
   }
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliBuilder.java b/src/test/java/com/android/tools/r8/smali/SmaliBuilder.java
index e9368e9..0a2c7ab 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliBuilder.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliBuilder.java
@@ -42,8 +42,14 @@
 
     @Override
     public String toString() {
-      return returnType + " " + clazz + "." + name
-          + "(" + StringUtils.join(parameterTypes, ",") + ")";
+      return returnType
+          + " "
+          + clazz
+          + "."
+          + name
+          + "("
+          + StringUtils.join(",", parameterTypes)
+          + ")";
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/testing/StackTraceTest.java b/src/test/java/com/android/tools/r8/testing/StackTraceTest.java
index 33915ef..41b6de3 100644
--- a/src/test/java/com/android/tools/r8/testing/StackTraceTest.java
+++ b/src/test/java/com/android/tools/r8/testing/StackTraceTest.java
@@ -40,12 +40,12 @@
   public void testJvmStackTrace() throws Exception {
     String stderr =
         StringUtils.join(
+            "\n",
             ImmutableList.of(
                 "Exception in thread \"main\" java.lang.RuntimeException",
                 "\tat com.example.A.method2(Test.java:30)",
                 "\tat com.example.A.method1(Test.java:20)",
-                "\tat com.example.Main.main(Test.java:10)"),
-            "\n");
+                "\tat com.example.Main.main(Test.java:10)"));
     checkStackTrace(StackTrace.extractFromJvm(stderr));
   }
 
@@ -95,8 +95,7 @@
             "\tat com.example.Main.main(Test.java:10)",
             "dex2oat I 10-30 11:41:40 232588 232588 dex2oat.cc:2808] dex2oat took 94.860ms"
                 + " (71.941ms cpu) (threads: 72) arena alloc=3KB (3312B) java alloc=32KB (32800B)"
-                + " native alloc=440KB (450720B) free=9MB (9539424B)"
-            );
+                + " native alloc=440KB (450720B) free=9MB (9539424B)");
     checkStackTrace(StackTrace.extractFromArt(stderr, DexVm.ART_5_1_1_HOST));
   }
 
diff --git a/src/test/java/com/android/tools/r8/utils/Smali.java b/src/test/java/com/android/tools/r8/utils/Smali.java
index 693af00..26e85e5 100644
--- a/src/test/java/com/android/tools/r8/utils/Smali.java
+++ b/src/test/java/com/android/tools/r8/utils/Smali.java
@@ -79,7 +79,7 @@
 
       if (parser.getNumberOfSyntaxErrors() > 0 || lexer.getNumberOfSyntaxErrors() > 0) {
         throw new RuntimeException(
-            "Error occured while compiling text:\n" + StringUtils.join(smaliTexts, "\n"));
+            "Error occured while compiling text:\n" + StringUtils.join("\n", smaliTexts));
       }
 
       CommonTree t = result.getTree();
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
index dfccf5a..a3f6892 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -352,8 +352,10 @@
     return dexMethod.method.name.toString()
         + "("
         + StringUtils.join(
+            "",
             Arrays.stream(dexMethod.method.proto.parameters.values)
-                .map(DexType::toDescriptorString).collect(Collectors.toList()), "")
+                .map(DexType::toDescriptorString)
+                .collect(Collectors.toList()))
         + ")"
         + dexMethod.method.proto.returnType.toDescriptorString();
   }
