diff --git a/src/main/java/com/android/tools/r8/graph/DelegatingUseRegistry.java b/src/main/java/com/android/tools/r8/graph/DelegatingUseRegistry.java
deleted file mode 100644
index 1375e9d..0000000
--- a/src/main/java/com/android/tools/r8/graph/DelegatingUseRegistry.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.graph;
-
-public class DelegatingUseRegistry extends UseRegistry {
-    private final UseRegistry delegate;
-
-    public DelegatingUseRegistry(DexItemFactory factory, UseRegistry delegate) {
-      super(factory);
-      this.delegate = delegate;
-    }
-
-    @Override
-    public boolean registerInvokeVirtual(DexMethod method) {
-      return delegate.registerInvokeVirtual(method);
-    }
-
-    @Override
-    public boolean registerInvokeDirect(DexMethod method) {
-      return delegate.registerInvokeDirect(method);
-    }
-
-    @Override
-    public boolean registerInvokeStatic(DexMethod method) {
-      return delegate.registerInvokeStatic(method);
-    }
-
-    @Override
-    public boolean registerInvokeInterface(DexMethod method) {
-      return delegate.registerInvokeInterface(method);
-    }
-
-    @Override
-    public boolean registerInvokeSuper(DexMethod method) {
-      return delegate.registerInvokeSuper(method);
-    }
-
-    @Override
-    public boolean registerInstanceFieldWrite(DexField field) {
-      return delegate.registerInstanceFieldWrite(field);
-    }
-
-    @Override
-    public boolean registerInstanceFieldRead(DexField field) {
-      return delegate.registerInstanceFieldRead(field);
-    }
-
-    @Override
-    public boolean registerNewInstance(DexType type) {
-      return delegate.registerNewInstance(type);
-    }
-
-    @Override
-    public boolean registerStaticFieldRead(DexField field) {
-      return delegate.registerStaticFieldRead(field);
-    }
-
-    @Override
-    public boolean registerStaticFieldWrite(DexField field) {
-      return delegate.registerStaticFieldWrite(field);
-    }
-
-    @Override
-    public boolean registerTypeReference(DexType type) {
-      return delegate.registerTypeReference(type);
-    }
-
-}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CodeOptimization.java b/src/main/java/com/android/tools/r8/ir/conversion/CodeOptimization.java
index 8a40db4..ce571d6 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CodeOptimization.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CodeOptimization.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
-import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.function.Consumer;
@@ -41,42 +40,4 @@
       }
     };
   }
-
-  /**
-   * Builder for {@link CodeOptimization}.
-   *
-   * Users can append either {@link CodeOptimization}, or simply {@link IRCode} consumer.
-   *
-   * Note that the order of everything that is appended through the builder matters.
-   */
-  public static class Builder {
-    private ImmutableList.Builder<CodeOptimization> processingQueue;
-
-    private Builder() {
-      processingQueue = ImmutableList.builder();
-    }
-
-    public static Builder builder() {
-      return new Builder();
-    }
-
-    public Builder addIRCodeConsumer(Consumer<IRCode> consumer) {
-      processingQueue.add(from(consumer));
-      return this;
-    }
-
-    public Builder addCodeOptimization(CodeOptimization optimization) {
-      processingQueue.add(optimization);
-      return this;
-    }
-
-    public CodeOptimization build() {
-      return (code, feedback, methodProcessor) -> {
-        processingQueue
-            .build()
-            .forEach(codeOptimization ->
-                codeOptimization.optimize(code, feedback, methodProcessor));
-      };
-    }
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/jar/JarArgumentUseVisitor.java b/src/main/java/com/android/tools/r8/jar/JarArgumentUseVisitor.java
deleted file mode 100644
index b46df5f..0000000
--- a/src/main/java/com/android/tools/r8/jar/JarArgumentUseVisitor.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.jar;
-
-import static org.objectweb.asm.Opcodes.ALOAD;
-import static com.android.tools.r8.utils.InternalOptions.ASM_VERSION;
-import static org.objectweb.asm.Opcodes.DLOAD;
-import static org.objectweb.asm.Opcodes.FLOAD;
-import static org.objectweb.asm.Opcodes.ILOAD;
-import static org.objectweb.asm.Opcodes.LLOAD;
-
-import com.android.tools.r8.graph.ArgumentUse;
-import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexProto;
-import com.android.tools.r8.graph.DexType;
-import it.unimi.dsi.fastutil.ints.Int2IntArrayMap;
-import it.unimi.dsi.fastutil.ints.Int2IntMap;
-import org.objectweb.asm.MethodVisitor;
-
-public class JarArgumentUseVisitor extends MethodVisitor {
-  private final ArgumentUse registry;
-  private final Int2IntMap slotToArgument;
-  private final int arguments;
-
-  public JarArgumentUseVisitor(DexEncodedMethod method, ArgumentUse registry) {
-    super(ASM_VERSION);
-    this.registry = registry;
-
-    DexProto proto = method.method.proto;
-    boolean isStatic = method.accessFlags.isStatic();
-
-    boolean hasLongOrDouble = false;
-    for (DexType value : proto.parameters.values) {
-      if (value.isLongType() || value.isDoubleType()) {
-        hasLongOrDouble = true;
-        break;
-      }
-    }
-    if (hasLongOrDouble) {
-      this.slotToArgument = new Int2IntArrayMap();
-      int nextSlot = 0;
-      int nextArgument = 0;
-      if (!isStatic) {
-        slotToArgument.put(nextSlot++, nextArgument++);
-      }
-      for (DexType value : proto.parameters.values) {
-        slotToArgument.put(nextSlot++, nextArgument++);
-        if (value.isLongType() || value.isDoubleType()) {
-          nextSlot++;
-        }
-      }
-      this.arguments = nextSlot;
-    } else {
-      this.slotToArgument = null;
-      this.arguments = proto.parameters.values.length + (isStatic ? 0 : 1);
-    }
-  }
-
-  @Override
-  public void visitIincInsn(final int var, final int increment) {
-    if (var < arguments) {
-      registry.register(slotToArgument == null ? var : slotToArgument.get(var));
-    }
-  }
-
-  @Override
-  public void visitVarInsn(final int opcode, final int var) {
-    switch (opcode) {
-      case ILOAD:
-      case LLOAD:
-      case FLOAD:
-      case DLOAD:
-      case ALOAD:
-        if (var < arguments) {
-          registry.register(slotToArgument == null ? var : slotToArgument.get(var));
-        }
-        break;
-
-      default:
-        // Ignore
-    }
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/jar/JarRegisterEffectsVisitor.java b/src/main/java/com/android/tools/r8/jar/JarRegisterEffectsVisitor.java
deleted file mode 100644
index fc9ea8b..0000000
--- a/src/main/java/com/android/tools/r8/jar/JarRegisterEffectsVisitor.java
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.jar;
-
-import static com.android.tools.r8.utils.InternalOptions.ASM_VERSION;
-
-import com.android.tools.r8.dex.Constants;
-import com.android.tools.r8.errors.CompilationError;
-import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.graph.DexCallSite;
-import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexMethodHandle;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.JarApplicationReader;
-import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.graph.UseRegistry.MethodHandleUse;
-import org.objectweb.asm.ConstantDynamic;
-import org.objectweb.asm.Handle;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
-public class JarRegisterEffectsVisitor extends MethodVisitor {
-  private final DexType clazz;
-  private final UseRegistry registry;
-  private final JarApplicationReader application;
-
-  public JarRegisterEffectsVisitor(DexType clazz, UseRegistry registry,
-      JarApplicationReader application) {
-    super(ASM_VERSION);
-    this.clazz = clazz;
-    this.registry = registry;
-    this.application = application;
-  }
-
-  @Override
-  public void visitTypeInsn(int opcode, String name) {
-    DexType type = application.getTypeFromName(name);
-    if (opcode == org.objectweb.asm.Opcodes.NEW) {
-      registry.registerNewInstance(type);
-    } else if (opcode == Opcodes.CHECKCAST) {
-      registry.registerCheckCast(type);
-    } else {
-      registry.registerTypeReference(type);
-    }
-  }
-
-  @Override
-  public void visitMultiANewArrayInsn(String desc, int dims) {
-    registry.registerTypeReference(application.getTypeFromDescriptor(desc));
-  }
-
-  @Override
-  public void visitLdcInsn(Object cst) {
-    if (cst instanceof Type) {
-      if (((Type) cst).getSort() == Type.METHOD) {
-        String descriptor = ((Type) cst).getDescriptor();
-        assert descriptor.charAt(0) == '(';
-        registry.registerProto(application.getProto(descriptor));
-      } else {
-        registry.registerConstClass(application.getType((Type) cst));
-      }
-    } else if (cst instanceof ConstantDynamic) {
-      throw new CompilationError("Unsupported dynamic constant: " + cst.toString());
-    } else if (cst instanceof Handle) {
-      DexMethodHandle handle = DexMethodHandle.fromAsmHandle((Handle) cst, application, clazz);
-      registry.registerMethodHandle(
-          handle, MethodHandleUse.NOT_ARGUMENT_TO_LAMBDA_METAFACTORY);
-    }
-  }
-
-  @Override
-  public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
-    DexType ownerType = application.getTypeFromName(owner);
-    DexMethod method = application.getMethod(ownerType, name, desc);
-    switch (opcode) {
-      case Opcodes.INVOKEVIRTUAL:
-        registry.registerInvokeVirtual(method);
-        break;
-      case Opcodes.INVOKESTATIC:
-        registry.registerInvokeStatic(method);
-        break;
-      case Opcodes.INVOKEINTERFACE:
-        registry.registerInvokeInterface(method);
-        break;
-      case Opcodes.INVOKESPECIAL:
-        if (name.equals(Constants.INSTANCE_INITIALIZER_NAME) || ownerType == clazz) {
-          registry.registerInvokeDirect(method);
-        } else {
-          registry.registerInvokeSuper(method);
-        }
-        break;
-      default:
-        throw new Unreachable("Unexpected opcode " + opcode);
-    }
-  }
-
-  @Override
-  public void visitFieldInsn(int opcode, String owner, String name, String desc) {
-    DexField field = application.getField(owner, name, desc);
-    switch (opcode) {
-      case Opcodes.GETFIELD:
-        registry.registerInstanceFieldRead(field);
-        break;
-      case Opcodes.PUTFIELD:
-        registry.registerInstanceFieldWrite(field);
-        break;
-      case Opcodes.GETSTATIC:
-        registry.registerStaticFieldRead(field);
-        break;
-      case Opcodes.PUTSTATIC:
-        registry.registerStaticFieldWrite(field);
-        break;
-      default:
-        throw new Unreachable("Unexpected opcode " + opcode);
-    }
-  }
-
-  @Override
-  public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
-    registry.registerCallSite(
-        DexCallSite.fromAsmInvokeDynamic(application, clazz, name, desc, bsm, bsmArgs));
-  }
-
-}
diff --git a/src/main/java/com/android/tools/r8/naming/ClassRenamingMapper.java b/src/main/java/com/android/tools/r8/naming/ClassRenamingMapper.java
deleted file mode 100644
index 8609fff..0000000
--- a/src/main/java/com/android/tools/r8/naming/ClassRenamingMapper.java
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.naming;
-
-import com.android.tools.r8.utils.BiMapContainer;
-import com.google.common.collect.ImmutableBiMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-import java.util.Map;
-
-/**
- * Provides a translation between class names based on a source and target proguard map.
- *
- * A mapping consists of:
- *
- * <ul>
- *   <li> {@link #translation} a bidirectional mapping between obfuscated names on the source
- *   proguard map to the corresponding class in the target proguard map
- *   <li> {@link #newClasses} a set of the unobfuscated names of classes that are in the source but
- *   not the target map
- *   <li> {@link #unusedNames} a set of names in the target map that are not used by the source map
- * </ul>
- */
-public class ClassRenamingMapper {
-
-  public static ClassRenamingMapper from(ClassNameMapper originalMap, ClassNameMapper targetMap) {
-    ImmutableBiMap.Builder<String, String> translationBuilder = ImmutableBiMap.builder();
-    ImmutableSet.Builder<String> newClasses = ImmutableSet.builder();
-
-    Map<String, String> sourceOriginalToObfuscated =
-        originalMap.getObfuscatedToOriginalMapping().inverse;
-
-    BiMapContainer<String, String> targetMapping = targetMap.getObfuscatedToOriginalMapping();
-    Map<String, String> targetOriginalToObfuscated = targetMapping.inverse;
-
-    for (String originalName : sourceOriginalToObfuscated.keySet()) {
-      String sourceObfuscatedName = sourceOriginalToObfuscated.get(originalName);
-      String targetObfuscatedName = targetOriginalToObfuscated.get(originalName);
-      if (targetObfuscatedName == null) {
-        newClasses.add(originalName);
-        continue;
-      }
-      translationBuilder.put(sourceObfuscatedName, targetObfuscatedName);
-    }
-
-    ImmutableBiMap<String, String> translation = translationBuilder.build();
-    ImmutableSet<String> unusedNames =
-        ImmutableSet.copyOf(Sets.difference(targetMapping.original.keySet(), translation.values()));
-
-    return new ClassRenamingMapper(translation, newClasses.build(), unusedNames);
-  }
-
-  /**
-   * Mapping from obfuscated class names in the source map to their counterpart in the target name
-   * map.
-   */
-  public final ImmutableBiMap<String, String> translation;
-
-  /**
-   * Set of (unobfuscated) class names that are present in the source map but not in the target map.
-   */
-  public final ImmutableSet<String> newClasses;
-
-  /**
-   * Set of (obfuscated) class names that are present in the target map but not in the source map.
-   */
-  public final ImmutableSet<String> unusedNames;
-
-  private ClassRenamingMapper(ImmutableBiMap<String, String> translation,
-      ImmutableSet<String> newClasses, ImmutableSet<String> unusedNames) {
-    this.translation = translation;
-    this.newClasses = newClasses;
-    this.unusedNames = unusedNames;
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder builder = new StringBuilder();
-    builder.append("Translation:\n\n");
-    for (String name : translation.keySet()) {
-      String newName = translation.get(name);
-      builder.append(name.equals(newName) ? "    " : " --- ")
-          .append(name)
-          .append(" -> ")
-          .append(newName)
-          .append('\n');
-    }
-    builder.append("\nNew classes:\n\n");
-    for (String name : newClasses) {
-      builder.append("    ")
-          .append(name)
-          .append('\n');
-    }
-    builder.append("\nUnused names:\n\n");
-    for (String unused : unusedNames) {
-      builder.append("    ")
-          .append(unused)
-          .append('\n');
-    }
-    return builder.toString();
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/utils/SimpleHashMap.java b/src/main/java/com/android/tools/r8/utils/SimpleHashMap.java
deleted file mode 100644
index 73f607a..0000000
--- a/src/main/java/com/android/tools/r8/utils/SimpleHashMap.java
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.utils;
-
-abstract class SimpleHashMap {
-
-  private int size = 0;  // number of elements in this hash map.
-  private int limit;  // resize when size reaches limit.
-  private int mask;  // length - 1.
-
-  // Constants for capacity.
-  static final int MIN_CAPACITY = 2;
-  static final int DEFAULT_CAPACITY = 50;
-
-  // Constant for loadfactor.
-  static final double MIN_LOAD_FACTOR = 0.2;
-  static final double MAX_LOAD_FACTOR = 0.8;
-  static final double DEFAULT_LOAD_FACTOR = 0.6;
-
-  SimpleHashMap() {
-    this(DEFAULT_CAPACITY);
-  }
-
-  SimpleHashMap(int initialCapacity) {
-    this(initialCapacity, DEFAULT_LOAD_FACTOR);
-  }
-
-  SimpleHashMap(int initialCapacity, double loadFactor) {
-    initialCapacity = Math.max(MIN_CAPACITY, initialCapacity);
-    loadFactor = Math.min(MAX_LOAD_FACTOR, Math.max(MIN_LOAD_FACTOR, loadFactor));
-    final int initialLength = roundToPow2((int) ((double) initialCapacity / loadFactor));
-    initialize(initialLength, (int) ((double) initialLength * loadFactor));
-  }
-
-  public int size() {
-    return size;
-  }
-
-  @Override
-  public String toString() {
-    return this.getClass().getName() + ", " + size + "(length " + length() + ")";
-  }
-
-  int length() {
-    return mask + 1;
-  }
-
-  void initialize(final int length, final int limit) {
-    size = 0;
-    mask = length - 1;
-    this.limit = limit;
-  }
-
-  void resize() {
-    // Double length and limit.
-    initialize(length() << 1, limit << 1);
-  }
-
-  void ensureCapacity() {
-    if (size >= limit) {
-      resize();
-    }
-  }
-
-  void incrementSize() {
-    size++;
-  }
-
-  private int roundToPow2(int number) {
-    number--;
-    number |= number >> 1;
-    number |= number >> 2;
-    number |= number >> 4;
-    number |= number >> 8;
-    number |= number >> 16;
-    return number + 1;
-  }
-
-  int firstProbe(final int hash) {
-    return hash & mask;
-  }
-
-  int nextProbe(final int last, final int index) {
-    return (last + index) & mask;
-  }
-}
