diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index cb1db15..ed992a3 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -55,7 +55,7 @@
  */
 public final class D8 {
 
-  private static final String kVersion = "v0.1.0";
+  private static final String VERSION = "v0.1.0";
   private static final int STATUS_ERROR = 1;
 
   private D8() {}
@@ -110,7 +110,7 @@
       return;
     }
     if (command.isPrintVersion()) {
-      System.out.println("D8 " + kVersion);
+      System.out.println("D8 " + VERSION);
       return;
     }
     run(command);
@@ -161,7 +161,7 @@
       return options.getMarker();
     }
     return new Marker(Tool.D8)
-        .put("version", kVersion)
+        .put("version", VERSION)
         .put("min-api", options.minApiLevel);
   }
 
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index bd51b5d..f30ee0a 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -71,7 +71,7 @@
 
 public class R8 {
 
-  private static final String kVersion = "v0.1.0";
+  private static final String VERSION = "v0.1.0";
   private final Timing timing = new Timing("R8");
   private final InternalOptions options;
 
@@ -86,7 +86,7 @@
       return options.getMarker();
     }
     return new Marker(Tool.R8)
-        .put("version", kVersion)
+        .put("version", VERSION)
         .put("min-api", options.minApiLevel);
   }
 
@@ -502,7 +502,7 @@
       return;
     }
     if (command.isPrintVersion()) {
-      System.out.println("R8 " + kVersion);
+      System.out.println("R8 " + VERSION);
       return;
     }
     run(command);
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index a8f56a7..f1162a9 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -253,10 +253,10 @@
 
   private void sortClassData(Collection<DexProgramClass> classesWithData) {
     for (DexProgramClass clazz : classesWithData) {
-      sortEncodedFields(clazz.instanceFields);
-      sortEncodedFields(clazz.staticFields);
-      sortEncodedMethods(clazz.directMethods);
-      sortEncodedMethods(clazz.virtualMethods);
+      sortEncodedFields(clazz.instanceFields());
+      sortEncodedFields(clazz.staticFields());
+      sortEncodedMethods(clazz.directMethods());
+      sortEncodedMethods(clazz.virtualMethods());
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexClass.java b/src/main/java/com/android/tools/r8/graph/DexClass.java
index d09d395..d9040af 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -22,10 +22,10 @@
   public DexType superType;
   public DexTypeList interfaces;
   public final DexString sourceFile;
-  public DexEncodedField[] staticFields;
-  public DexEncodedField[] instanceFields;
-  public DexEncodedMethod[] directMethods;
-  public DexEncodedMethod[] virtualMethods;
+  protected DexEncodedField[] staticFields;
+  protected DexEncodedField[] instanceFields;
+  protected DexEncodedMethod[] directMethods;
+  protected DexEncodedMethod[] virtualMethods;
   public DexAnnotationSet annotations;
 
   public DexClass(
@@ -39,10 +39,10 @@
     this.accessFlags = accessFlags;
     this.superType = superType;
     this.type = type;
-    this.staticFields = staticFields;
-    this.instanceFields = instanceFields;
-    this.directMethods = directMethods;
-    this.virtualMethods = virtualMethods;
+    setStaticFields(staticFields);
+    setInstanceFields(instanceFields);
+    setDirectMethods(directMethods);
+    setVirtualMethods(virtualMethods);
     this.annotations = annotations;
     if (type == superType) {
       throw new CompilationError("Class " + type.toString() + " cannot extend itself");
@@ -66,13 +66,22 @@
   }
 
   public DexEncodedMethod[] directMethods() {
-    return MoreObjects.firstNonNull(directMethods, NO_METHODS);
+    return directMethods;
+  }
+
+  public void setDirectMethods(DexEncodedMethod[] values) {
+    directMethods = MoreObjects.firstNonNull(values, NO_METHODS);
   }
 
   public DexEncodedMethod[] virtualMethods() {
-    return MoreObjects.firstNonNull(virtualMethods, NO_METHODS);
+    return virtualMethods;
   }
 
+  public void setVirtualMethods(DexEncodedMethod[] values) {
+    virtualMethods = MoreObjects.firstNonNull(values, NO_METHODS);
+  }
+
+
   public void forEachMethod(Consumer<DexEncodedMethod> consumer) {
     for (DexEncodedMethod method : directMethods()) {
       consumer.accept(method);
@@ -103,11 +112,19 @@
   }
 
   public DexEncodedField[] staticFields() {
-    return MoreObjects.firstNonNull(staticFields, NO_FIELDS);
+    return staticFields;
+  }
+
+  public void setStaticFields(DexEncodedField[] values) {
+    staticFields = MoreObjects.firstNonNull(values, NO_FIELDS);
   }
 
   public DexEncodedField[] instanceFields() {
-    return MoreObjects.firstNonNull(instanceFields, NO_FIELDS);
+    return instanceFields;
+  }
+
+  public void setInstanceFields(DexEncodedField[] values) {
+    instanceFields = MoreObjects.firstNonNull(values, NO_FIELDS);
   }
 
   /**
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
index 236c9e5..b7036f5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
@@ -80,15 +80,15 @@
     }
 
     // Add the methods.
-    DexEncodedMethod[] existing = clazz.virtualMethods;
-    clazz.virtualMethods = new DexEncodedMethod[existing.length + methodsToImplement.size()];
-    System.arraycopy(existing, 0, clazz.virtualMethods, 0, existing.length);
+    DexEncodedMethod[] existing = clazz.virtualMethods();
+    clazz.setVirtualMethods(new DexEncodedMethod[existing.length + methodsToImplement.size()]);
+    System.arraycopy(existing, 0, clazz.virtualMethods(), 0, existing.length);
 
     for (int i = 0; i < methodsToImplement.size(); i++) {
       DexEncodedMethod method = methodsToImplement.get(i);
       assert method.accessFlags.isPublic() && !method.accessFlags.isAbstract();
       DexEncodedMethod newMethod = addForwardingMethod(method, clazz);
-      clazz.virtualMethods[existing.length + i] = newMethod;
+      clazz.virtualMethods()[existing.length + i] = newMethod;
       createdMethods.put(newMethod, method);
     }
   }
@@ -142,7 +142,7 @@
     current = clazz;
     while (true) {
       // Hide candidates by virtual method of the class.
-      hideCandidates(current.virtualMethods, candidates, toBeImplemented);
+      hideCandidates(current.virtualMethods(), candidates, toBeImplemented);
       if (candidates.isEmpty()) {
         return toBeImplemented;
       }
@@ -218,12 +218,12 @@
     }
 
     // Hide by virtual methods of this interface.
-    for (DexEncodedMethod virtual : clazz.virtualMethods) {
+    for (DexEncodedMethod virtual : clazz.virtualMethods()) {
       helper.hideMatches(virtual.method);
     }
 
     // Add all default methods of this interface.
-    for (DexEncodedMethod encoded : clazz.virtualMethods) {
+    for (DexEncodedMethod encoded : clazz.virtualMethods()) {
       if (rewriter.isDefaultMethod(encoded)) {
         helper.addDefaultMethod(encoded);
       }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
index a84e082..2d06abe 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
@@ -44,7 +44,7 @@
 
     // Process virtual interface methods first.
     List<DexEncodedMethod> remainingMethods = new ArrayList<>();
-    for (DexEncodedMethod virtual : iface.virtualMethods) {
+    for (DexEncodedMethod virtual : iface.virtualMethods()) {
       if (rewriter.isDefaultMethod(virtual)) {
         // Create a new method in a companion class to represent default method implementation.
         DexMethod companionMethod = rewriter.defaultAsMethodOfCompanionClass(virtual.method);
@@ -79,14 +79,14 @@
     }
 
     // If at least one bridge methods was removed update the table.
-    if (remainingMethods.size() < iface.virtualMethods.length) {
-      iface.virtualMethods = remainingMethods.toArray(
-          new DexEncodedMethod[remainingMethods.size()]);
+    if (remainingMethods.size() < iface.virtualMethods().length) {
+      iface.setVirtualMethods(remainingMethods.toArray(
+          new DexEncodedMethod[remainingMethods.size()]));
     }
     remainingMethods.clear();
 
     // Process static methods, move them into companion class as well.
-    for (DexEncodedMethod direct : iface.directMethods) {
+    for (DexEncodedMethod direct : iface.directMethods()) {
       if (direct.accessFlags.isPrivate()) {
         // We only expect to see private methods which are lambda$ methods,
         // and they are supposed to be relaxed to package private static methods
@@ -105,9 +105,9 @@
         remainingMethods.add(direct);
       }
     }
-    if (remainingMethods.size() < iface.directMethods.length) {
-      iface.directMethods = remainingMethods.toArray(
-          new DexEncodedMethod[remainingMethods.size()]);
+    if (remainingMethods.size() < iface.directMethods().length) {
+      iface.setDirectMethods(remainingMethods.toArray(
+          new DexEncodedMethod[remainingMethods.size()]));
     }
 
     if (companionMethods.isEmpty()) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index 0a6ea7e..be6252a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -444,7 +444,7 @@
       DexMethod implMethod = descriptor.implHandle.asMethod();
       DexClass implMethodHolder = definitionFor(implMethod.holder);
 
-      DexEncodedMethod[] directMethods = implMethodHolder.directMethods;
+      DexEncodedMethod[] directMethods = implMethodHolder.directMethods();
       for (int i = 0; i < directMethods.length; i++) {
         DexEncodedMethod encodedMethod = directMethods[i];
         if (implMethod.match(encodedMethod)) {
@@ -491,8 +491,8 @@
       DexEncodedMethod accessorEncodedMethod = new DexEncodedMethod(
           callTarget, accessorFlags, DexAnnotationSet.empty(), DexAnnotationSetRefList.empty(),
           new SynthesizedCode(new AccessorMethodSourceCode(LambdaClass.this)));
-      accessorClass.directMethods = appendMethod(
-          accessorClass.directMethods, accessorEncodedMethod);
+      accessorClass.setDirectMethods(appendMethod(
+          accessorClass.directMethods(), accessorEncodedMethod));
       rewriter.converter.optimizeSynthesizedMethod(accessorEncodedMethod);
       return true;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
index af32cb7..f6f8f2c 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
@@ -162,7 +162,7 @@
   public void removeLambdaDeserializationMethods(Iterable<DexProgramClass> classes) {
     for (DexProgramClass clazz : classes) {
       // Search for a lambda deserialization method and remove it if found.
-      DexEncodedMethod[] directMethods = clazz.directMethods;
+      DexEncodedMethod[] directMethods = clazz.directMethods();
       if (directMethods != null) {
         int methodCount = directMethods.length;
         for (int i = 0; i < methodCount; i++) {
@@ -177,7 +177,7 @@
             DexEncodedMethod[] newMethods = new DexEncodedMethod[methodCount - 1];
             System.arraycopy(directMethods, 0, newMethods, 0, i);
             System.arraycopy(directMethods, i + 1, newMethods, i, methodCount - i - 1);
-            clazz.directMethods = newMethods;
+            clazz.setDirectMethods(newMethods);
 
             // We assume there is only one such method in the class.
             break;
diff --git a/src/main/java/com/android/tools/r8/optimize/VisibilityBridgeRemover.java b/src/main/java/com/android/tools/r8/optimize/VisibilityBridgeRemover.java
index 31c7f1f..300f18e 100644
--- a/src/main/java/com/android/tools/r8/optimize/VisibilityBridgeRemover.java
+++ b/src/main/java/com/android/tools/r8/optimize/VisibilityBridgeRemover.java
@@ -60,7 +60,7 @@
         .collect(Collectors.toSet());
     for (DexType type : classes) {
       DexClass clazz = appInfo.definitionFor(type);
-      clazz.virtualMethods = removeMethods(clazz.virtualMethods, unneededVisibilityBridges);
+      clazz.setVirtualMethods(removeMethods(clazz.virtualMethods(), unneededVisibilityBridges));
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/shaking/AbstractMethodRemover.java b/src/main/java/com/android/tools/r8/shaking/AbstractMethodRemover.java
index 2850790..3fd5470 100644
--- a/src/main/java/com/android/tools/r8/shaking/AbstractMethodRemover.java
+++ b/src/main/java/com/android/tools/r8/shaking/AbstractMethodRemover.java
@@ -35,7 +35,7 @@
     DexClass holder = appInfo.definitionFor(type);
     scope = new ScopedDexItemSet(scope);
     if (holder != null) {
-      holder.virtualMethods = processMethods(holder.virtualMethods);
+      holder.setVirtualMethods(processMethods(holder.virtualMethods()));
     }
     type.forAllExtendsSubtypes(this::processClass);
     scope = scope.getParent();
@@ -74,10 +74,6 @@
     private final ScopedDexItemSet parent;
     private final Set<Wrapper<DexMethod>> items = new HashSet<>();
 
-    private ScopedDexItemSet() {
-      this(null);
-    }
-
     private ScopedDexItemSet(ScopedDexItemSet parent) {
       this.parent = parent;
     }
diff --git a/src/main/java/com/android/tools/r8/shaking/SimpleClassMerger.java b/src/main/java/com/android/tools/r8/shaking/SimpleClassMerger.java
index d3306d9..c04b29a 100644
--- a/src/main/java/com/android/tools/r8/shaking/SimpleClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/SimpleClassMerger.java
@@ -257,20 +257,20 @@
           ? DexTypeList.empty()
           : new DexTypeList(interfaces.toArray(new DexType[interfaces.size()]));
       // Step 2: replace fields and methods.
-      target.directMethods = mergedDirectMethods
-          .toArray(new DexEncodedMethod[mergedDirectMethods.size()]);
-      target.virtualMethods = mergedVirtualMethods
-          .toArray(new DexEncodedMethod[mergedVirtualMethods.size()]);
-      target.staticFields = mergedStaticFields
-          .toArray(new DexEncodedField[mergedStaticFields.size()]);
-      target.instanceFields = mergedInstanceFields
-          .toArray(new DexEncodedField[mergedInstanceFields.size()]);
+      target.setDirectMethods(mergedDirectMethods
+          .toArray(new DexEncodedMethod[mergedDirectMethods.size()]));
+      target.setVirtualMethods(mergedVirtualMethods
+          .toArray(new DexEncodedMethod[mergedVirtualMethods.size()]));
+      target.setStaticFields(mergedStaticFields
+          .toArray(new DexEncodedField[mergedStaticFields.size()]));
+      target.setInstanceFields(mergedInstanceFields
+          .toArray(new DexEncodedField[mergedInstanceFields.size()]));
       // Step 3: Unlink old class to ease tree shaking.
       source.superType = application.dexItemFactory.objectType;
-      source.directMethods = null;
-      source.virtualMethods = null;
-      source.instanceFields = null;
-      source.staticFields = null;
+      source.setDirectMethods(null);
+      source.setVirtualMethods(null);
+      source.setInstanceFields(null);
+      source.setStaticFields(null);
       source.interfaces = DexTypeList.empty();
       // Step 4: Record merging.
       mergedClasses.put(source.type, target.type);
@@ -427,11 +427,11 @@
     private GraphLense fixupTypeReferences(GraphLense graphLense) {
       // Globally substitute merged class types in protos and holders.
       for (DexProgramClass clazz : appInfo.classes()) {
-        clazz.directMethods = substituteTypesIn(clazz.directMethods);
-        clazz.virtualMethods = substituteTypesIn(clazz.virtualMethods);
-        clazz.virtualMethods = removeDupes(clazz.virtualMethods);
-        clazz.staticFields = substituteTypesIn(clazz.staticFields);
-        clazz.instanceFields = substituteTypesIn(clazz.instanceFields);
+        clazz.setDirectMethods(substituteTypesIn(clazz.directMethods()));
+        clazz.setVirtualMethods(substituteTypesIn(clazz.virtualMethods()));
+        clazz.setVirtualMethods(removeDupes(clazz.virtualMethods()));
+        clazz.setStaticFields(substituteTypesIn(clazz.staticFields()));
+        clazz.setInstanceFields(substituteTypesIn(clazz.instanceFields()));
       }
       // Record type renamings so instanceof and checkcast checks are also fixed.
       for (DexType type : mergedClasses.keySet()) {
diff --git a/src/main/java/com/android/tools/r8/shaking/TreePruner.java b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
index 58646a8..64294bd 100644
--- a/src/main/java/com/android/tools/r8/shaking/TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
@@ -84,10 +84,10 @@
         // The class is used and must be kept. Remove the unused fields and methods from
         // the class.
         usagePrinter.visiting(clazz);
-        clazz.directMethods = reachableMethods(clazz.directMethods(), clazz);
-        clazz.virtualMethods = reachableMethods(clazz.virtualMethods(), clazz);
-        clazz.instanceFields = reachableFields(clazz.instanceFields());
-        clazz.staticFields = reachableFields(clazz.staticFields());
+        clazz.setDirectMethods(reachableMethods(clazz.directMethods(), clazz));
+        clazz.setVirtualMethods(reachableMethods(clazz.virtualMethods(), clazz));
+        clazz.setInstanceFields(reachableFields(clazz.instanceFields()));
+        clazz.setStaticFields(reachableFields(clazz.staticFields()));
         usagePrinter.visited();
       }
     }
diff --git a/src/test/java/com/android/tools/r8/smali/OutlineTest.java b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
index 4656cd6..c726aad 100644
--- a/src/test/java/com/android/tools/r8/smali/OutlineTest.java
+++ b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
@@ -828,13 +828,13 @@
     DexInspector inspector = new DexInspector(processedApplication);
     ClassSubject clazz = inspector.clazz(options.outline.className);
     assertTrue(clazz.isPresent());
-    assertEquals(3, clazz.getDexClass().directMethods.length);
+    assertEquals(3, clazz.getDexClass().directMethods().length);
     // Collect the return types of the putlines for the body of method1 and method2.
     List<DexType> r = new ArrayList<>();
-    for (int i = 0; i < clazz.getDexClass().directMethods.length; i++) {
-      if (clazz.getDexClass().directMethods[i].getCode().asDexCode().instructions[0]
+    for (int i = 0; i < clazz.getDexClass().directMethods().length; i++) {
+      if (clazz.getDexClass().directMethods()[i].getCode().asDexCode().instructions[0]
           instanceof InvokeVirtual) {
-        r.add(clazz.getDexClass().directMethods[i].method.proto.returnType);
+        r.add(clazz.getDexClass().directMethods()[i].method.proto.returnType);
       }
     }
     assert r.size() == 2;
