Prefix dex instructions with 'Dex' for consistency with cf instructions

This also moves com.android.tools.r8.code to
com.android.tools.r8.dex.code.

Change-Id: I072840c0d09bcae8c233d69f5e073b559f8c769f
diff --git a/src/main/java/com/android/tools/r8/ResourceShrinker.java b/src/main/java/com/android/tools/r8/ResourceShrinker.java
index bf40d89..b5ab2b6 100644
--- a/src/main/java/com/android/tools/r8/ResourceShrinker.java
+++ b/src/main/java/com/android/tools/r8/ResourceShrinker.java
@@ -3,38 +3,38 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8;
 
-import com.android.tools.r8.code.Const;
-import com.android.tools.r8.code.Const16;
-import com.android.tools.r8.code.Const4;
-import com.android.tools.r8.code.ConstHigh16;
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.ConstStringJumbo;
-import com.android.tools.r8.code.ConstWide16;
-import com.android.tools.r8.code.ConstWide32;
-import com.android.tools.r8.code.FillArrayData;
-import com.android.tools.r8.code.FillArrayDataPayload;
-import com.android.tools.r8.code.Format35c;
-import com.android.tools.r8.code.Format3rc;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.InvokeDirect;
-import com.android.tools.r8.code.InvokeDirectRange;
-import com.android.tools.r8.code.InvokeInterface;
-import com.android.tools.r8.code.InvokeInterfaceRange;
-import com.android.tools.r8.code.InvokeStatic;
-import com.android.tools.r8.code.InvokeStaticRange;
-import com.android.tools.r8.code.InvokeSuper;
-import com.android.tools.r8.code.InvokeSuperRange;
-import com.android.tools.r8.code.InvokeVirtual;
-import com.android.tools.r8.code.InvokeVirtualRange;
-import com.android.tools.r8.code.NewArray;
-import com.android.tools.r8.code.Sget;
-import com.android.tools.r8.code.SgetBoolean;
-import com.android.tools.r8.code.SgetByte;
-import com.android.tools.r8.code.SgetChar;
-import com.android.tools.r8.code.SgetObject;
-import com.android.tools.r8.code.SgetShort;
-import com.android.tools.r8.code.SgetWide;
 import com.android.tools.r8.dex.ApplicationReader;
+import com.android.tools.r8.dex.code.DexConst;
+import com.android.tools.r8.dex.code.DexConst16;
+import com.android.tools.r8.dex.code.DexConst4;
+import com.android.tools.r8.dex.code.DexConstHigh16;
+import com.android.tools.r8.dex.code.DexConstString;
+import com.android.tools.r8.dex.code.DexConstStringJumbo;
+import com.android.tools.r8.dex.code.DexConstWide16;
+import com.android.tools.r8.dex.code.DexConstWide32;
+import com.android.tools.r8.dex.code.DexFillArrayData;
+import com.android.tools.r8.dex.code.DexFillArrayDataPayload;
+import com.android.tools.r8.dex.code.DexFormat35c;
+import com.android.tools.r8.dex.code.DexFormat3rc;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeDirect;
+import com.android.tools.r8.dex.code.DexInvokeDirectRange;
+import com.android.tools.r8.dex.code.DexInvokeInterface;
+import com.android.tools.r8.dex.code.DexInvokeInterfaceRange;
+import com.android.tools.r8.dex.code.DexInvokeStatic;
+import com.android.tools.r8.dex.code.DexInvokeStaticRange;
+import com.android.tools.r8.dex.code.DexInvokeSuper;
+import com.android.tools.r8.dex.code.DexInvokeSuperRange;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
+import com.android.tools.r8.dex.code.DexInvokeVirtualRange;
+import com.android.tools.r8.dex.code.DexNewArray;
+import com.android.tools.r8.dex.code.DexSget;
+import com.android.tools.r8.dex.code.DexSgetBoolean;
+import com.android.tools.r8.dex.code.DexSgetByte;
+import com.android.tools.r8.dex.code.DexSgetChar;
+import com.android.tools.r8.dex.code.DexSgetObject;
+import com.android.tools.r8.dex.code.DexSgetShort;
+import com.android.tools.r8.dex.code.DexSgetWide;
 import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexAnnotationElement;
@@ -219,12 +219,12 @@
         final Set<Integer> methodIntArrayPayloadOffsets = Sets.newHashSet();
         // First we collect payloads, and then we process them because payload can be before the
         // fill-array-data instruction referencing it.
-        final List<FillArrayDataPayload> payloads = Lists.newArrayList();
+        final List<DexFillArrayDataPayload> payloads = Lists.newArrayList();
 
-        Instruction[] instructions = implementation.asDexCode().instructions;
+        DexInstruction[] instructions = implementation.asDexCode().instructions;
         int current = 0;
         while (current < instructions.length) {
-          Instruction instruction = instructions[current];
+          DexInstruction instruction = instructions[current];
           if (isIntConstInstruction(instruction)) {
             processIntConstInstruction(instruction);
           } else if (isStringConstInstruction(instruction)) {
@@ -235,15 +235,15 @@
             processInvokeInstruction(instruction);
           } else if (isInvokeRangeInstruction(instruction)) {
             processInvokeRangeInstruction(instruction);
-          } else if (instruction instanceof FillArrayData) {
+          } else if (instruction instanceof DexFillArrayData) {
             processFillArray(instructions, current, methodIntArrayPayloadOffsets);
-          } else if (instruction instanceof FillArrayDataPayload) {
-            payloads.add((FillArrayDataPayload) instruction);
+          } else if (instruction instanceof DexFillArrayDataPayload) {
+            payloads.add((DexFillArrayDataPayload) instruction);
           }
           current++;
         }
 
-        for (FillArrayDataPayload payload : payloads) {
+        for (DexFillArrayDataPayload payload : payloads) {
           if (isIntArrayPayload(payload, methodIntArrayPayloadOffsets)) {
             processIntArrayPayload(payload);
           }
@@ -272,8 +272,8 @@
               });
     }
 
-    private void processIntArrayPayload(Instruction instruction) {
-      FillArrayDataPayload payload = (FillArrayDataPayload) instruction;
+    private void processIntArrayPayload(DexInstruction instruction) {
+      DexFillArrayDataPayload payload = (DexFillArrayDataPayload) instruction;
 
       for (int i = 0; i < payload.data.length / 2; i++) {
         int intValue = payload.data[2 * i + 1] << 16 | payload.data[2 * i];
@@ -282,20 +282,20 @@
     }
 
     private boolean isIntArrayPayload(
-        Instruction instruction, Set<Integer> methodIntArrayPayloadOffsets) {
-      if (!(instruction instanceof FillArrayDataPayload)) {
+        DexInstruction instruction, Set<Integer> methodIntArrayPayloadOffsets) {
+      if (!(instruction instanceof DexFillArrayDataPayload)) {
         return false;
       }
 
-      FillArrayDataPayload payload = (FillArrayDataPayload) instruction;
+      DexFillArrayDataPayload payload = (DexFillArrayDataPayload) instruction;
       return methodIntArrayPayloadOffsets.contains(payload.getOffset());
     }
 
     private void processFillArray(
-        Instruction[] instructions, int current, Set<Integer> methodIntArrayPayloadOffsets) {
-      FillArrayData fillArrayData = (FillArrayData) instructions[current];
-      if (current > 0 && instructions[current - 1] instanceof NewArray) {
-        NewArray newArray = (NewArray) instructions[current - 1];
+        DexInstruction[] instructions, int current, Set<Integer> methodIntArrayPayloadOffsets) {
+      DexFillArrayData fillArrayData = (DexFillArrayData) instructions[current];
+      if (current > 0 && instructions[current - 1] instanceof DexNewArray) {
+        DexNewArray newArray = (DexNewArray) instructions[current - 1];
         if (!Objects.equals(newArray.getType().descriptor.toString(), "[I")) {
           return;
         }
@@ -334,17 +334,17 @@
       }
     }
 
-    private boolean isIntConstInstruction(Instruction instruction) {
+    private boolean isIntConstInstruction(DexInstruction instruction) {
       int opcode = instruction.getOpcode();
-      return opcode == Const4.OPCODE
-          || opcode == Const16.OPCODE
-          || opcode == Const.OPCODE
-          || opcode == ConstWide32.OPCODE
-          || opcode == ConstHigh16.OPCODE
-          || opcode == ConstWide16.OPCODE;
+      return opcode == DexConst4.OPCODE
+          || opcode == DexConst16.OPCODE
+          || opcode == DexConst.OPCODE
+          || opcode == DexConstWide32.OPCODE
+          || opcode == DexConstHigh16.OPCODE
+          || opcode == DexConstWide16.OPCODE;
     }
 
-    private void processIntConstInstruction(Instruction instruction) {
+    private void processIntConstInstruction(DexInstruction instruction) {
       assert isIntConstInstruction(instruction);
 
       int constantValue;
@@ -365,20 +365,20 @@
       callback.referencedInt(constantValue);
     }
 
-    private boolean isStringConstInstruction(Instruction instruction) {
+    private boolean isStringConstInstruction(DexInstruction instruction) {
       int opcode = instruction.getOpcode();
-      return opcode == ConstString.OPCODE || opcode == ConstStringJumbo.OPCODE;
+      return opcode == DexConstString.OPCODE || opcode == DexConstStringJumbo.OPCODE;
     }
 
-    private void processStringConstantInstruction(Instruction instruction) {
+    private void processStringConstantInstruction(DexInstruction instruction) {
       assert isStringConstInstruction(instruction);
 
       String constantValue;
-      if (instruction instanceof ConstString) {
-        ConstString constString = (ConstString) instruction;
+      if (instruction instanceof DexConstString) {
+        DexConstString constString = (DexConstString) instruction;
         constantValue = constString.getString().toString();
-      } else if (instruction instanceof ConstStringJumbo) {
-        ConstStringJumbo constStringJumbo = (ConstStringJumbo) instruction;
+      } else if (instruction instanceof DexConstStringJumbo) {
+        DexConstStringJumbo constStringJumbo = (DexConstStringJumbo) instruction;
         constantValue = constStringJumbo.getString().toString();
       } else {
         throw new AssertionError("Not a string constant instruction.");
@@ -387,41 +387,41 @@
       callback.referencedString(constantValue);
     }
 
-    private boolean isGetStatic(Instruction instruction) {
+    private boolean isGetStatic(DexInstruction instruction) {
       int opcode = instruction.getOpcode();
-      return opcode == Sget.OPCODE
-          || opcode == SgetBoolean.OPCODE
-          || opcode == SgetByte.OPCODE
-          || opcode == SgetChar.OPCODE
-          || opcode == SgetObject.OPCODE
-          || opcode == SgetShort.OPCODE
-          || opcode == SgetWide.OPCODE;
+      return opcode == DexSget.OPCODE
+          || opcode == DexSgetBoolean.OPCODE
+          || opcode == DexSgetByte.OPCODE
+          || opcode == DexSgetChar.OPCODE
+          || opcode == DexSgetObject.OPCODE
+          || opcode == DexSgetShort.OPCODE
+          || opcode == DexSgetWide.OPCODE;
     }
 
-    private void processGetStatic(Instruction instruction) {
+    private void processGetStatic(DexInstruction instruction) {
       assert isGetStatic(instruction);
 
       DexField field;
-      if (instruction instanceof Sget) {
-        Sget sget = (Sget) instruction;
+      if (instruction instanceof DexSget) {
+        DexSget sget = (DexSget) instruction;
         field = sget.getField();
-      } else if (instruction instanceof SgetBoolean) {
-        SgetBoolean sgetBoolean = (SgetBoolean) instruction;
+      } else if (instruction instanceof DexSgetBoolean) {
+        DexSgetBoolean sgetBoolean = (DexSgetBoolean) instruction;
         field = sgetBoolean.getField();
-      } else if (instruction instanceof SgetByte) {
-        SgetByte sgetByte = (SgetByte) instruction;
+      } else if (instruction instanceof DexSgetByte) {
+        DexSgetByte sgetByte = (DexSgetByte) instruction;
         field = sgetByte.getField();
-      } else if (instruction instanceof SgetChar) {
-        SgetChar sgetChar = (SgetChar) instruction;
+      } else if (instruction instanceof DexSgetChar) {
+        DexSgetChar sgetChar = (DexSgetChar) instruction;
         field = sgetChar.getField();
-      } else if (instruction instanceof SgetObject) {
-        SgetObject sgetObject = (SgetObject) instruction;
+      } else if (instruction instanceof DexSgetObject) {
+        DexSgetObject sgetObject = (DexSgetObject) instruction;
         field = sgetObject.getField();
-      } else if (instruction instanceof SgetShort) {
-        SgetShort sgetShort = (SgetShort) instruction;
+      } else if (instruction instanceof DexSgetShort) {
+        DexSgetShort sgetShort = (DexSgetShort) instruction;
         field = sgetShort.getField();
-      } else if (instruction instanceof SgetWide) {
-        SgetWide sgetWide = (SgetWide) instruction;
+      } else if (instruction instanceof DexSgetWide) {
+        DexSgetWide sgetWide = (DexSgetWide) instruction;
         field = sgetWide.getField();
       } else {
         throw new AssertionError("Not a get static instruction");
@@ -430,19 +430,19 @@
       callback.referencedStaticField(field.holder.getInternalName(), field.name.toString());
     }
 
-    private boolean isInvokeInstruction(Instruction instruction) {
+    private boolean isInvokeInstruction(DexInstruction instruction) {
       int opcode = instruction.getOpcode();
-      return opcode == InvokeVirtual.OPCODE
-          || opcode == InvokeSuper.OPCODE
-          || opcode == InvokeDirect.OPCODE
-          || opcode == InvokeStatic.OPCODE
-          || opcode == InvokeInterface.OPCODE;
+      return opcode == DexInvokeVirtual.OPCODE
+          || opcode == DexInvokeSuper.OPCODE
+          || opcode == DexInvokeDirect.OPCODE
+          || opcode == DexInvokeStatic.OPCODE
+          || opcode == DexInvokeInterface.OPCODE;
     }
 
-    private void processInvokeInstruction(Instruction instruction) {
+    private void processInvokeInstruction(DexInstruction instruction) {
       assert isInvokeInstruction(instruction);
 
-      Format35c ins35c = (Format35c) instruction;
+      DexFormat35c ins35c = (DexFormat35c) instruction;
       DexMethod method = (DexMethod) ins35c.BBBB;
 
       callback.referencedMethod(
@@ -451,19 +451,19 @@
           method.proto.toDescriptorString());
     }
 
-    private boolean isInvokeRangeInstruction(Instruction instruction) {
+    private boolean isInvokeRangeInstruction(DexInstruction instruction) {
       int opcode = instruction.getOpcode();
-      return opcode == InvokeVirtualRange.OPCODE
-          || opcode == InvokeSuperRange.OPCODE
-          || opcode == InvokeDirectRange.OPCODE
-          || opcode == InvokeStaticRange.OPCODE
-          || opcode == InvokeInterfaceRange.OPCODE;
+      return opcode == DexInvokeVirtualRange.OPCODE
+          || opcode == DexInvokeSuperRange.OPCODE
+          || opcode == DexInvokeDirectRange.OPCODE
+          || opcode == DexInvokeStaticRange.OPCODE
+          || opcode == DexInvokeInterfaceRange.OPCODE;
     }
 
-    private void processInvokeRangeInstruction(Instruction instruction) {
+    private void processInvokeRangeInstruction(DexInstruction instruction) {
       assert isInvokeRangeInstruction(instruction);
 
-      Format3rc ins3rc = (Format3rc) instruction;
+      DexFormat3rc ins3rc = (DexFormat3rc) instruction;
       DexMethod method = (DexMethod) ins3rc.BBBB;
 
       callback.referencedMethod(
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInstanceFieldRead.java b/src/main/java/com/android/tools/r8/cf/code/CfInstanceFieldRead.java
index 95dac9b..1eb4b5d 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInstanceFieldRead.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInstanceFieldRead.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.cf.code;
 
-import com.android.tools.r8.code.CfOrDexInstanceFieldRead;
+import com.android.tools.r8.dex.code.CfOrDexInstanceFieldRead;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.CfCode;
 import com.android.tools.r8.graph.DexClassAndMethod;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java b/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java
index cd2a0a5..dc1f4de 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java
@@ -4,8 +4,8 @@
 package com.android.tools.r8.cf.code;
 
 import com.android.tools.r8.cf.CfPrinter;
-import com.android.tools.r8.code.CfOrDexInstruction;
-import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.code.CfOrDexInstruction;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.CfCode;
@@ -147,7 +147,7 @@
   }
 
   @Override
-  public Instruction asDexInstruction() {
+  public DexInstruction asDexInstruction() {
     return null;
   }
 
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfStaticFieldRead.java b/src/main/java/com/android/tools/r8/cf/code/CfStaticFieldRead.java
index cc9a7f9..e0d1ab1 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfStaticFieldRead.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfStaticFieldRead.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.cf.code;
 
-import com.android.tools.r8.code.CfOrDexStaticFieldRead;
+import com.android.tools.r8.dex.code.CfOrDexStaticFieldRead;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.CfCode;
 import com.android.tools.r8.graph.DexClassAndMethod;
diff --git a/src/main/java/com/android/tools/r8/code/BaseInstructionFactory.java b/src/main/java/com/android/tools/r8/code/BaseInstructionFactory.java
deleted file mode 100644
index 4e15eb9..0000000
--- a/src/main/java/com/android/tools/r8/code/BaseInstructionFactory.java
+++ /dev/null
@@ -1,465 +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.code;
-
-import com.android.tools.r8.graph.OffsetToObjectMapping;
-
-abstract class BaseInstructionFactory {
-
-  static Instruction create(int high, int opcode, BytecodeStream stream,
-      OffsetToObjectMapping mapping) {
-    switch (opcode) {
-      case 0x0:
-        return Nop.create(high, stream);
-      case Move.OPCODE:
-        return new Move(high, stream);
-      case MoveFrom16.OPCODE:
-        return new MoveFrom16(high, stream);
-      case Move16.OPCODE:
-        return new Move16(high, stream);
-      case MoveWide.OPCODE:
-        return new MoveWide(high, stream);
-      case MoveWideFrom16.OPCODE:
-        return new MoveWideFrom16(high, stream);
-      case MoveWide16.OPCODE:
-        return new MoveWide16(high, stream);
-      case MoveObject.OPCODE:
-        return new MoveObject(high, stream);
-      case MoveObjectFrom16.OPCODE:
-        return new MoveObjectFrom16(high, stream);
-      case MoveObject16.OPCODE:
-        return new MoveObject16(high, stream);
-      case MoveResult.OPCODE:
-        return new MoveResult(high, stream);
-      case MoveResultWide.OPCODE:
-        return new MoveResultWide(high, stream);
-      case MoveResultObject.OPCODE:
-        return new MoveResultObject(high, stream);
-      case MoveException.OPCODE:
-        return new MoveException(high, stream);
-      case ReturnVoid.OPCODE:
-        return new ReturnVoid(high, stream);
-      case Return.OPCODE:
-        return new Return(high, stream);
-      case ReturnWide.OPCODE:
-        return new ReturnWide(high, stream);
-      case ReturnObject.OPCODE:
-        return new ReturnObject(high, stream);
-      case Const4.OPCODE:
-        return new Const4(high, stream);
-      case Const16.OPCODE:
-        return new Const16(high, stream);
-      case Const.OPCODE:
-        return new Const(high, stream);
-      case ConstHigh16.OPCODE:
-        return new ConstHigh16(high, stream);
-      case ConstWide16.OPCODE:
-        return new ConstWide16(high, stream);
-      case ConstWide32.OPCODE:
-        return new ConstWide32(high, stream);
-      case ConstWide.OPCODE:
-        return new ConstWide(high, stream);
-      case ConstWideHigh16.OPCODE:
-        return new ConstWideHigh16(high, stream);
-      case ConstString.OPCODE:
-        return new ConstString(high, stream, mapping);
-      case ConstStringJumbo.OPCODE:
-        return new ConstStringJumbo(high, stream, mapping);
-      case ConstClass.OPCODE:
-        return new ConstClass(high, stream, mapping);
-      case MonitorEnter.OPCODE:
-        return new MonitorEnter(high, stream);
-      case MonitorExit.OPCODE:
-        return new MonitorExit(high, stream);
-      case CheckCast.OPCODE:
-        return new CheckCast(high, stream, mapping);
-      case InstanceOf.OPCODE:
-        return new InstanceOf(high, stream, mapping);
-      case ArrayLength.OPCODE:
-        return new ArrayLength(high, stream);
-      case NewInstance.OPCODE:
-        return new NewInstance(high, stream, mapping);
-      case NewArray.OPCODE:
-        return new NewArray(high, stream, mapping);
-      case FilledNewArray.OPCODE:
-        return new FilledNewArray(high, stream, mapping);
-      case FilledNewArrayRange.OPCODE:
-        return new FilledNewArrayRange(high, stream, mapping);
-      case FillArrayData.OPCODE:
-        return new FillArrayData(high, stream);
-      case Throw.OPCODE:
-        return new Throw(high, stream);
-      case Goto.OPCODE:
-        return new Goto(high, stream);
-      case Goto16.OPCODE:
-        return new Goto16(high, stream);
-      case Goto32.OPCODE:
-        return new Goto32(high, stream);
-      case PackedSwitch.OPCODE:
-        return new PackedSwitch(high, stream);
-      case SparseSwitch.OPCODE:
-        return new SparseSwitch(high, stream);
-      case CmplFloat.OPCODE:
-        return new CmplFloat(high, stream);
-      case CmpgFloat.OPCODE:
-        return new CmpgFloat(high, stream);
-      case CmplDouble.OPCODE:
-        return new CmplDouble(high, stream);
-      case CmpgDouble.OPCODE:
-        return new CmpgDouble(high, stream);
-      case CmpLong.OPCODE:
-        return new CmpLong(high, stream);
-      case IfEq.OPCODE:
-        return new IfEq(high, stream);
-      case IfNe.OPCODE:
-        return new IfNe(high, stream);
-      case IfLt.OPCODE:
-        return new IfLt(high, stream);
-      case IfGe.OPCODE:
-        return new IfGe(high, stream);
-      case IfGt.OPCODE:
-        return new IfGt(high, stream);
-      case IfLe.OPCODE:
-        return new IfLe(high, stream);
-      case IfEqz.OPCODE:
-        return new IfEqz(high, stream);
-      case IfNez.OPCODE:
-        return new IfNez(high, stream);
-      case IfLtz.OPCODE:
-        return new IfLtz(high, stream);
-      case IfGez.OPCODE:
-        return new IfGez(high, stream);
-      case IfGtz.OPCODE:
-        return new IfGtz(high, stream);
-      case IfLez.OPCODE:
-        return new IfLez(high, stream);
-      case Aget.OPCODE:
-        return new Aget(high, stream);
-      case AgetWide.OPCODE:
-        return new AgetWide(high, stream);
-      case AgetObject.OPCODE:
-        return new AgetObject(high, stream);
-      case AgetBoolean.OPCODE:
-        return new AgetBoolean(high, stream);
-      case AgetByte.OPCODE:
-        return new AgetByte(high, stream);
-      case AgetChar.OPCODE:
-        return new AgetChar(high, stream);
-      case AgetShort.OPCODE:
-        return new AgetShort(high, stream);
-      case Aput.OPCODE:
-        return new Aput(high, stream);
-      case AputWide.OPCODE:
-        return new AputWide(high, stream);
-      case AputObject.OPCODE:
-        return new AputObject(high, stream);
-      case AputBoolean.OPCODE:
-        return new AputBoolean(high, stream);
-      case AputByte.OPCODE:
-        return new AputByte(high, stream);
-      case AputChar.OPCODE:
-        return new AputChar(high, stream);
-      case AputShort.OPCODE:
-        return new AputShort(high, stream);
-      case Iget.OPCODE:
-        return new Iget(high, stream, mapping);
-      case IgetWide.OPCODE:
-        return new IgetWide(high, stream, mapping);
-      case IgetObject.OPCODE:
-        return new IgetObject(high, stream, mapping);
-      case IgetBoolean.OPCODE:
-        return new IgetBoolean(high, stream, mapping);
-      case IgetByte.OPCODE:
-        return new IgetByte(high, stream, mapping);
-      case IgetChar.OPCODE:
-        return new IgetChar(high, stream, mapping);
-      case IgetShort.OPCODE:
-        return new IgetShort(high, stream, mapping);
-      case Iput.OPCODE:
-        return new Iput(high, stream, mapping);
-      case IputWide.OPCODE:
-        return new IputWide(high, stream, mapping);
-      case IputObject.OPCODE:
-        return new IputObject(high, stream, mapping);
-      case IputBoolean.OPCODE:
-        return new IputBoolean(high, stream, mapping);
-      case IputByte.OPCODE:
-        return new IputByte(high, stream, mapping);
-      case IputChar.OPCODE:
-        return new IputChar(high, stream, mapping);
-      case IputShort.OPCODE:
-        return new IputShort(high, stream, mapping);
-      case Sget.OPCODE:
-        return new Sget(high, stream, mapping);
-      case SgetWide.OPCODE:
-        return new SgetWide(high, stream, mapping);
-      case SgetObject.OPCODE:
-        return new SgetObject(high, stream, mapping);
-      case SgetBoolean.OPCODE:
-        return new SgetBoolean(high, stream, mapping);
-      case SgetByte.OPCODE:
-        return new SgetByte(high, stream, mapping);
-      case SgetChar.OPCODE:
-        return new SgetChar(high, stream, mapping);
-      case SgetShort.OPCODE:
-        return new SgetShort(high, stream, mapping);
-      case Sput.OPCODE:
-        return new Sput(high, stream, mapping);
-      case SputWide.OPCODE:
-        return new SputWide(high, stream, mapping);
-      case SputObject.OPCODE:
-        return new SputObject(high, stream, mapping);
-      case SputBoolean.OPCODE:
-        return new SputBoolean(high, stream, mapping);
-      case SputByte.OPCODE:
-        return new SputByte(high, stream, mapping);
-      case SputChar.OPCODE:
-        return new SputChar(high, stream, mapping);
-      case SputShort.OPCODE:
-        return new SputShort(high, stream, mapping);
-      case InvokeVirtual.OPCODE:
-        return new InvokeVirtual(high, stream, mapping);
-      case InvokeSuper.OPCODE:
-        return new InvokeSuper(high, stream, mapping);
-      case InvokeDirect.OPCODE:
-        return new InvokeDirect(high, stream, mapping);
-      case InvokeStatic.OPCODE:
-        return new InvokeStatic(high, stream, mapping);
-      case InvokeInterface.OPCODE:
-        return new InvokeInterface(high, stream, mapping);
-      case InvokeVirtualRange.OPCODE:
-        return new InvokeVirtualRange(high, stream, mapping);
-      case InvokeSuperRange.OPCODE:
-        return new InvokeSuperRange(high, stream, mapping);
-      case InvokeDirectRange.OPCODE:
-        return new InvokeDirectRange(high, stream, mapping);
-      case InvokeStaticRange.OPCODE:
-        return new InvokeStaticRange(high, stream, mapping);
-      case InvokeInterfaceRange.OPCODE:
-        return new InvokeInterfaceRange(high, stream, mapping);
-      case NegInt.OPCODE:
-        return new NegInt(high, stream);
-      case NotInt.OPCODE:
-        return new NotInt(high, stream);
-      case NegLong.OPCODE:
-        return new NegLong(high, stream);
-      case NotLong.OPCODE:
-        return new NotLong(high, stream);
-      case NegFloat.OPCODE:
-        return new NegFloat(high, stream);
-      case NegDouble.OPCODE:
-        return new NegDouble(high, stream);
-      case IntToLong.OPCODE:
-        return new IntToLong(high, stream);
-      case IntToFloat.OPCODE:
-        return new IntToFloat(high, stream);
-      case IntToDouble.OPCODE:
-        return new IntToDouble(high, stream);
-      case LongToInt.OPCODE:
-        return new LongToInt(high, stream);
-      case LongToFloat.OPCODE:
-        return new LongToFloat(high, stream);
-      case LongToDouble.OPCODE:
-        return new LongToDouble(high, stream);
-      case FloatToInt.OPCODE:
-        return new FloatToInt(high, stream);
-      case FloatToLong.OPCODE:
-        return new FloatToLong(high, stream);
-      case FloatToDouble.OPCODE:
-        return new FloatToDouble(high, stream);
-      case DoubleToInt.OPCODE:
-        return new DoubleToInt(high, stream);
-      case DoubleToLong.OPCODE:
-        return new DoubleToLong(high, stream);
-      case DoubleToFloat.OPCODE:
-        return new DoubleToFloat(high, stream);
-      case IntToByte.OPCODE:
-        return new IntToByte(high, stream);
-      case IntToChar.OPCODE:
-        return new IntToChar(high, stream);
-      case IntToShort.OPCODE:
-        return new IntToShort(high, stream);
-      case AddInt.OPCODE:
-        return new AddInt(high, stream);
-      case SubInt.OPCODE:
-        return new SubInt(high, stream);
-      case MulInt.OPCODE:
-        return new MulInt(high, stream);
-      case DivInt.OPCODE:
-        return new DivInt(high, stream);
-      case RemInt.OPCODE:
-        return new RemInt(high, stream);
-      case AndInt.OPCODE:
-        return new AndInt(high, stream);
-      case OrInt.OPCODE:
-        return new OrInt(high, stream);
-      case XorInt.OPCODE:
-        return new XorInt(high, stream);
-      case ShlInt.OPCODE:
-        return new ShlInt(high, stream);
-      case ShrInt.OPCODE:
-        return new ShrInt(high, stream);
-      case UshrInt.OPCODE:
-        return new UshrInt(high, stream);
-      case AddLong.OPCODE:
-        return new AddLong(high, stream);
-      case SubLong.OPCODE:
-        return new SubLong(high, stream);
-      case MulLong.OPCODE:
-        return new MulLong(high, stream);
-      case DivLong.OPCODE:
-        return new DivLong(high, stream);
-      case RemLong.OPCODE:
-        return new RemLong(high, stream);
-      case AndLong.OPCODE:
-        return new AndLong(high, stream);
-      case OrLong.OPCODE:
-        return new OrLong(high, stream);
-      case XorLong.OPCODE:
-        return new XorLong(high, stream);
-      case ShlLong.OPCODE:
-        return new ShlLong(high, stream);
-      case ShrLong.OPCODE:
-        return new ShrLong(high, stream);
-      case UshrLong.OPCODE:
-        return new UshrLong(high, stream);
-      case AddFloat.OPCODE:
-        return new AddFloat(high, stream);
-      case SubFloat.OPCODE:
-        return new SubFloat(high, stream);
-      case MulFloat.OPCODE:
-        return new MulFloat(high, stream);
-      case DivFloat.OPCODE:
-        return new DivFloat(high, stream);
-      case RemFloat.OPCODE:
-        return new RemFloat(high, stream);
-      case AddDouble.OPCODE:
-        return new AddDouble(high, stream);
-      case SubDouble.OPCODE:
-        return new SubDouble(high, stream);
-      case MulDouble.OPCODE:
-        return new MulDouble(high, stream);
-      case DivDouble.OPCODE:
-        return new DivDouble(high, stream);
-      case RemDouble.OPCODE:
-        return new RemDouble(high, stream);
-      case AddInt2Addr.OPCODE:
-        return new AddInt2Addr(high, stream);
-      case SubInt2Addr.OPCODE:
-        return new SubInt2Addr(high, stream);
-      case MulInt2Addr.OPCODE:
-        return new MulInt2Addr(high, stream);
-      case DivInt2Addr.OPCODE:
-        return new DivInt2Addr(high, stream);
-      case RemInt2Addr.OPCODE:
-        return new RemInt2Addr(high, stream);
-      case AndInt2Addr.OPCODE:
-        return new AndInt2Addr(high, stream);
-      case OrInt2Addr.OPCODE:
-        return new OrInt2Addr(high, stream);
-      case XorInt2Addr.OPCODE:
-        return new XorInt2Addr(high, stream);
-      case ShlInt2Addr.OPCODE:
-        return new ShlInt2Addr(high, stream);
-      case ShrInt2Addr.OPCODE:
-        return new ShrInt2Addr(high, stream);
-      case UshrInt2Addr.OPCODE:
-        return new UshrInt2Addr(high, stream);
-      case AddLong2Addr.OPCODE:
-        return new AddLong2Addr(high, stream);
-      case SubLong2Addr.OPCODE:
-        return new SubLong2Addr(high, stream);
-      case MulLong2Addr.OPCODE:
-        return new MulLong2Addr(high, stream);
-      case DivLong2Addr.OPCODE:
-        return new DivLong2Addr(high, stream);
-      case RemLong2Addr.OPCODE:
-        return new RemLong2Addr(high, stream);
-      case AndLong2Addr.OPCODE:
-        return new AndLong2Addr(high, stream);
-      case OrLong2Addr.OPCODE:
-        return new OrLong2Addr(high, stream);
-      case XorLong2Addr.OPCODE:
-        return new XorLong2Addr(high, stream);
-      case ShlLong2Addr.OPCODE:
-        return new ShlLong2Addr(high, stream);
-      case ShrLong2Addr.OPCODE:
-        return new ShrLong2Addr(high, stream);
-      case UshrLong2Addr.OPCODE:
-        return new UshrLong2Addr(high, stream);
-      case AddFloat2Addr.OPCODE:
-        return new AddFloat2Addr(high, stream);
-      case SubFloat2Addr.OPCODE:
-        return new SubFloat2Addr(high, stream);
-      case MulFloat2Addr.OPCODE:
-        return new MulFloat2Addr(high, stream);
-      case DivFloat2Addr.OPCODE:
-        return new DivFloat2Addr(high, stream);
-      case RemFloat2Addr.OPCODE:
-        return new RemFloat2Addr(high, stream);
-      case AddDouble2Addr.OPCODE:
-        return new AddDouble2Addr(high, stream);
-      case SubDouble2Addr.OPCODE:
-        return new SubDouble2Addr(high, stream);
-      case MulDouble2Addr.OPCODE:
-        return new MulDouble2Addr(high, stream);
-      case DivDouble2Addr.OPCODE:
-        return new DivDouble2Addr(high, stream);
-      case RemDouble2Addr.OPCODE:
-        return new RemDouble2Addr(high, stream);
-      case AddIntLit16.OPCODE:
-        return new AddIntLit16(high, stream);
-      case RsubInt.OPCODE:
-        return new RsubInt(high, stream);
-      case MulIntLit16.OPCODE:
-        return new MulIntLit16(high, stream);
-      case DivIntLit16.OPCODE:
-        return new DivIntLit16(high, stream);
-      case RemIntLit16.OPCODE:
-        return new RemIntLit16(high, stream);
-      case AndIntLit16.OPCODE:
-        return new AndIntLit16(high, stream);
-      case OrIntLit16.OPCODE:
-        return new OrIntLit16(high, stream);
-      case XorIntLit16.OPCODE:
-        return new XorIntLit16(high, stream);
-      case AddIntLit8.OPCODE:
-        return new AddIntLit8(high, stream);
-      case RsubIntLit8.OPCODE:
-        return new RsubIntLit8(high, stream);
-      case MulIntLit8.OPCODE:
-        return new MulIntLit8(high, stream);
-      case DivIntLit8.OPCODE:
-        return new DivIntLit8(high, stream);
-      case RemIntLit8.OPCODE:
-        return new RemIntLit8(high, stream);
-      case AndIntLit8.OPCODE:
-        return new AndIntLit8(high, stream);
-      case OrIntLit8.OPCODE:
-        return new OrIntLit8(high, stream);
-      case XorIntLit8.OPCODE:
-        return new XorIntLit8(high, stream);
-      case ShlIntLit8.OPCODE:
-        return new ShlIntLit8(high, stream);
-      case ShrIntLit8.OPCODE:
-        return new ShrIntLit8(high, stream);
-      case UshrIntLit8.OPCODE:
-        return new UshrIntLit8(high, stream);
-      case InvokePolymorphic.OPCODE:
-        return new InvokePolymorphic(high, stream, mapping);
-      case InvokePolymorphicRange.OPCODE:
-        return new InvokePolymorphicRange(high, stream, mapping);
-      case InvokeCustom.OPCODE:
-        return new InvokeCustom(high, stream, mapping);
-      case InvokeCustomRange.OPCODE:
-        return new InvokeCustomRange(high, stream, mapping);
-      case ConstMethodHandle.OPCODE:
-        return new ConstMethodHandle(high, stream, mapping);
-      case ConstMethodType.OPCODE:
-        return new ConstMethodType(high, stream, mapping);
-      default:
-        throw new IllegalArgumentException("Illegal Opcode: 0x" + Integer.toString(opcode, 16));
-    }
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java b/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java
index 173ddd1..634f40b 100644
--- a/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java
+++ b/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.debuginfo;
 
-import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.dex.VirtualFile;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexDebugInfo;
 import com.android.tools.r8.graph.DexDebugInfo.PcBasedDebugInfo;
@@ -94,7 +94,7 @@
         }
         DexCode code = definition.getCode().asDexCode();
         DexDebugInfo debugInfo = code.getDebugInfo();
-        Instruction lastInstruction = getLastExecutableInstruction(code);
+        DexInstruction lastInstruction = getLastExecutableInstruction(code);
         if (lastInstruction == null) {
           continue;
         }
@@ -120,7 +120,7 @@
     if (conversionInfo.cutoff < 0) {
       return false;
     }
-    Instruction lastInstruction = getLastExecutableInstruction(code);
+    DexInstruction lastInstruction = getLastExecutableInstruction(code);
     if (lastInstruction == null) {
       return false;
     }
@@ -264,9 +264,9 @@
     }
   }
 
-  private static Instruction getLastExecutableInstruction(DexCode code) {
-    Instruction lastInstruction = null;
-    for (Instruction instruction : code.instructions) {
+  private static DexInstruction getLastExecutableInstruction(DexCode code) {
+    DexInstruction lastInstruction = null;
+    for (DexInstruction instruction : code.instructions) {
       if (!instruction.isPayload()) {
         lastInstruction = instruction;
       }
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index 7a3ccf5..8705bb4 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -9,8 +9,8 @@
 import static com.android.tools.r8.utils.EncodedValueUtils.parseUnsigned;
 
 import com.android.tools.r8.ProgramResource.Kind;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.InstructionFactory;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInstructionFactory;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.graph.ApplicationReaderMap;
 import com.android.tools.r8.graph.ClassAccessFlags;
@@ -167,7 +167,7 @@
       dexReader.position(offset);
       dexReader.align(4);
       DexCode code = parseCodeItem();
-      codes.put(offset, code);  // Update the file local offset to code mapping.
+      codes.put(offset, code); // Update the file local offset to code mapping.
       dexReader.position(currentPos);
     }
   }
@@ -297,7 +297,7 @@
           DexMethodHandle value =
               indexedItems.getMethodHandle((int) parseUnsigned(dexReader, size));
           return new DexValue.DexValueMethodHandle(value);
-      }
+        }
       default:
         throw new IndexOutOfBoundsException();
     }
@@ -306,9 +306,10 @@
   private void checkName(DexString name) {
     if (!options.itemFactory.getSkipNameValidationForTesting()
         && !name.isValidSimpleName(options.getMinApiLevel())) {
-      throw new CompilationError("Space characters in SimpleName '"
-        + name.toASCIIString()
-        + "' are not allowed prior to DEX version 040");
+      throw new CompilationError(
+          "Space characters in SimpleName '"
+              + name.toASCIIString()
+              + "' are not allowed prior to DEX version 040");
     }
   }
 
@@ -333,7 +334,6 @@
     return values;
   }
 
-
   private DexEncodedArray parseEncodedArray() {
     return new DexEncodedArray(parseEncodedArrayValues());
   }
@@ -415,10 +415,11 @@
     DexParameterAnnotation[] result = new DexParameterAnnotation[size];
     for (int i = 0; i < size; i++) {
       DexMethod method = indexedItems.getMethod(methodIndices[i]);
-      result[i] = new DexParameterAnnotation(
-          method,
-          annotationSetRefListAt(annotationOffsets[i])
-              .withParameterCount(method.proto.parameters.size()));
+      result[i] =
+          new DexParameterAnnotation(
+              method,
+              annotationSetRefListAt(annotationOffsets[i])
+                  .withParameterCount(method.proto.parameters.size()));
     }
     dexReader.position(saved);
     return result;
@@ -433,11 +434,11 @@
 
   private <S> Object cacheAt(int offset, Supplier<S> function) {
     if (offset == 0) {
-      return null;  // return null for offset zero.
+      return null; // return null for offset zero.
     }
     Object result = offsetMap.get(offset);
     if (result != null) {
-      return result;  // return the cached result.
+      return result; // return the cached result.
     }
     // Cache is empty so parse the structure.
     dexReader.position(offset);
@@ -484,8 +485,7 @@
     }
     DexType dupType = DexAnnotationSet.findDuplicateEntryType(result);
     if (dupType != null) {
-      throw new CompilationError(
-          "Multiple annotations of type `" + dupType.toSourceString() + "`");
+      throw new CompilationError("Multiple annotations of type `" + dupType.toSourceString() + "`");
     }
     return DexAnnotationSet.create(result);
   }
@@ -500,8 +500,8 @@
   }
 
   private AnnotationsDirectory annotationsDirectoryAt(int offset) {
-    return (AnnotationsDirectory) cacheAt(offset, this::parseAnnotationsDirectory,
-        AnnotationsDirectory::empty);
+    return (AnnotationsDirectory)
+        cacheAt(offset, this::parseAnnotationsDirectory, AnnotationsDirectory::empty);
   }
 
   private AnnotationsDirectory parseAnnotationsDirectory() {
@@ -513,10 +513,7 @@
     final DexMethodAnnotation[] methods = parseMethodAnnotations(methodsSize);
     final DexParameterAnnotation[] parameters = parseParameterAnnotations(parametersSize);
     return new AnnotationsDirectory(
-        annotationSetAt(classAnnotationsOff),
-        fields,
-        methods,
-        parameters);
+        annotationSetAt(classAnnotationsOff), fields, methods, parameters);
   }
 
   private DexDebugInfo debugInfoAt(int offset) {
@@ -548,72 +545,82 @@
           events.add(dexItemFactory.createAdvanceLine(dexReader.getSleb128()));
           isPcBasedDebugInfo = false;
           break;
-        case Constants.DBG_START_LOCAL: {
-          int registerNum = dexReader.getUleb128();
-          int nameIdx = dexReader.getUleb128p1();
-          int typeIdx = dexReader.getUleb128p1();
-          events.add(new DexDebugEvent.StartLocal(
-              registerNum,
-              nameIdx == NO_INDEX ? null : indexedItems.getString(nameIdx),
-              typeIdx == NO_INDEX ? null : indexedItems.getType(typeIdx),
-              null));
-          isPcBasedDebugInfo = false;
-          break;
-        }
-        case Constants.DBG_START_LOCAL_EXTENDED: {
-          int registerNum = dexReader.getUleb128();
-          int nameIdx = dexReader.getUleb128p1();
-          int typeIdx = dexReader.getUleb128p1();
-          int sigIdx = dexReader.getUleb128p1();
-          events.add(new DexDebugEvent.StartLocal(
-              registerNum,
-              nameIdx == NO_INDEX ? null : indexedItems.getString(nameIdx),
-              typeIdx == NO_INDEX ? null : indexedItems.getType(typeIdx),
-              sigIdx == NO_INDEX ? null : indexedItems.getString(sigIdx)));
-          isPcBasedDebugInfo = false;
-          break;
-        }
-        case Constants.DBG_END_LOCAL: {
-          events.add(dexItemFactory.createEndLocal(dexReader.getUleb128()));
-          isPcBasedDebugInfo = false;
-          break;
-        }
-        case Constants.DBG_RESTART_LOCAL: {
-          events.add(dexItemFactory.createRestartLocal(dexReader.getUleb128()));
-          isPcBasedDebugInfo = false;
-          break;
-        }
-        case Constants.DBG_SET_PROLOGUE_END: {
-          events.add(dexItemFactory.createSetPrologueEnd());
-          isPcBasedDebugInfo = false;
-          break;
-        }
-        case Constants.DBG_SET_EPILOGUE_BEGIN: {
-          events.add(dexItemFactory.createSetEpilogueBegin());
-          isPcBasedDebugInfo = false;
-          break;
-        }
-        case Constants.DBG_SET_FILE: {
-          int nameIdx = dexReader.getUleb128p1();
-          DexString sourceFile = nameIdx == NO_INDEX ? null : indexedItems.getString(nameIdx);
-          if (options.readDebugSetFileEvent) {
-            events.add(dexItemFactory.createSetFile(sourceFile));
+        case Constants.DBG_START_LOCAL:
+          {
+            int registerNum = dexReader.getUleb128();
+            int nameIdx = dexReader.getUleb128p1();
+            int typeIdx = dexReader.getUleb128p1();
+            events.add(
+                new DexDebugEvent.StartLocal(
+                    registerNum,
+                    nameIdx == NO_INDEX ? null : indexedItems.getString(nameIdx),
+                    typeIdx == NO_INDEX ? null : indexedItems.getType(typeIdx),
+                    null));
+            isPcBasedDebugInfo = false;
+            break;
           }
-          isPcBasedDebugInfo = false;
-          break;
-        }
-        default: {
-          assert head >= 0x0a && head <= 0xff;
-          Default event = dexItemFactory.createDefault(head);
-          events.add(event);
-          if (isPcBasedDebugInfo) {
-            if (events.size() == 1) {
-              isPcBasedDebugInfo = event.equals(dexItemFactory.zeroChangeDefaultEvent);
-            } else {
-              isPcBasedDebugInfo = event.equals(dexItemFactory.oneChangeDefaultEvent);
+        case Constants.DBG_START_LOCAL_EXTENDED:
+          {
+            int registerNum = dexReader.getUleb128();
+            int nameIdx = dexReader.getUleb128p1();
+            int typeIdx = dexReader.getUleb128p1();
+            int sigIdx = dexReader.getUleb128p1();
+            events.add(
+                new DexDebugEvent.StartLocal(
+                    registerNum,
+                    nameIdx == NO_INDEX ? null : indexedItems.getString(nameIdx),
+                    typeIdx == NO_INDEX ? null : indexedItems.getType(typeIdx),
+                    sigIdx == NO_INDEX ? null : indexedItems.getString(sigIdx)));
+            isPcBasedDebugInfo = false;
+            break;
+          }
+        case Constants.DBG_END_LOCAL:
+          {
+            events.add(dexItemFactory.createEndLocal(dexReader.getUleb128()));
+            isPcBasedDebugInfo = false;
+            break;
+          }
+        case Constants.DBG_RESTART_LOCAL:
+          {
+            events.add(dexItemFactory.createRestartLocal(dexReader.getUleb128()));
+            isPcBasedDebugInfo = false;
+            break;
+          }
+        case Constants.DBG_SET_PROLOGUE_END:
+          {
+            events.add(dexItemFactory.createSetPrologueEnd());
+            isPcBasedDebugInfo = false;
+            break;
+          }
+        case Constants.DBG_SET_EPILOGUE_BEGIN:
+          {
+            events.add(dexItemFactory.createSetEpilogueBegin());
+            isPcBasedDebugInfo = false;
+            break;
+          }
+        case Constants.DBG_SET_FILE:
+          {
+            int nameIdx = dexReader.getUleb128p1();
+            DexString sourceFile = nameIdx == NO_INDEX ? null : indexedItems.getString(nameIdx);
+            if (options.readDebugSetFileEvent) {
+              events.add(dexItemFactory.createSetFile(sourceFile));
+            }
+            isPcBasedDebugInfo = false;
+            break;
+          }
+        default:
+          {
+            assert head >= 0x0a && head <= 0xff;
+            Default event = dexItemFactory.createDefault(head);
+            events.add(event);
+            if (isPcBasedDebugInfo) {
+              if (events.size() == 1) {
+                isPcBasedDebugInfo = event.equals(dexItemFactory.zeroChangeDefaultEvent);
+              } else {
+                isPcBasedDebugInfo = event.equals(dexItemFactory.oneChangeDefaultEvent);
+              }
             }
           }
-        }
       }
     }
     return isPcBasedDebugInfo
@@ -650,8 +657,8 @@
     }
   }
 
-  private DexEncodedField[] readFields(int size, DexFieldAnnotation[] annotations,
-      DexValue[] staticValues) {
+  private DexEncodedField[] readFields(
+      int size, DexFieldAnnotation[] annotations, DexValue[] staticValues) {
     DexEncodedField[] fields = new DexEncodedField[size];
     int fieldIndex = 0;
     MemberAnnotationIterator<DexField, DexAnnotationSet> annotationIterator =
@@ -784,8 +791,9 @@
       // Check if constraints from
       // https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 are met.
       if (!flags.areValid(Constants.CORRESPONDING_CLASS_FILE_VERSION, false)) {
-        throw new CompilationError("Class " + type.toSourceString()
-            + " has illegal access flags. Found: " + flags, origin);
+        throw new CompilationError(
+            "Class " + type.toSourceString() + " has illegal access flags. Found: " + flags,
+            origin);
       }
       DexEncodedField[] staticFields = DexEncodedField.EMPTY_ARRAY;
       DexEncodedField[] instanceFields = DexEncodedField.EMPTY_ARRAY;
@@ -811,8 +819,11 @@
         int directMethodsSize = dexReader.getUleb128();
         int virtualMethodsSize = dexReader.getUleb128();
 
-        staticFields = readFields(staticFieldsSize, annotationsDirectory.fields,
-            staticValues != null ? staticValues.values : null);
+        staticFields =
+            readFields(
+                staticFieldsSize,
+                annotationsDirectory.fields,
+                staticValues != null ? staticValues.values : null);
         instanceFields = readFields(instanceFieldsSize, annotationsDirectory.fields, null);
         directMethods =
             readMethods(
@@ -857,7 +868,7 @@
               dexItemFactory.getSkipNameValidationForTesting(),
               checksumSupplier,
               null);
-      classCollection.accept(clazz);  // Update the application object.
+      classCollection.accept(clazz); // Update the application object.
     }
   }
 
@@ -913,8 +924,13 @@
       for (int i = 0; i < result.length; i++) {
         DexSection dexSection = result[i];
         int nextOffset = i < result.length - 1 ? result[i + 1].offset : dexSection.offset;
-        Log.debug(this.getClass(), "Read section 0x%04x @ 0x%08x #items %08d size 0x%08x.",
-            dexSection.type, dexSection.offset, dexSection.length, nextOffset - dexSection.offset);
+        Log.debug(
+            this.getClass(),
+            "Read section 0x%04x @ 0x%08x #items %08d size 0x%08x.",
+            dexSection.type,
+            dexSection.offset,
+            dexSection.length,
+            nextOffset - dexSection.offset);
       }
     }
     for (int i = 0; i < mapSize - 1; i++) {
@@ -940,7 +956,7 @@
         code[i] = dexReader.getShort();
       }
       if (insnsSize % 2 != 0) {
-        dexReader.getUshort();  // Skip padding ushort
+        dexReader.getUshort(); // Skip padding ushort
       }
       if (triesSize > 0) {
         Int2IntArrayMap handlerMap = new Int2IntArrayMap();
@@ -987,20 +1003,20 @@
     int saved = dexReader.position();
     DexDebugInfo debugInfo = debugInfoAt(debugInfoOff);
     dexReader.position(saved);
-    InstructionFactory factory = new InstructionFactory();
-    Instruction[] instructions =
+    DexInstructionFactory factory = new DexInstructionFactory();
+    DexInstruction[] instructions =
         factory.readSequenceFrom(ShortBuffer.wrap(code), 0, code.length, indexedItems);
     return new DexCode(registerSize, insSize, outsSize, instructions, tries, handlers, debugInfo);
   }
 
   void populateIndexTables() {
     // Populate structures that are already sorted upon read.
-    populateStrings();  // Depends on nothing.
+    populateStrings(); // Depends on nothing.
     populateChecksums(); // Depends on Strings.
-    populateTypes();  // Depends on Strings.
-    populateFields();  // Depends on Types, and Strings.
-    populateProtos();  // Depends on Types and Strings.
-    populateMethods();  // Depends on Protos, Types, and Strings.
+    populateTypes(); // Depends on Strings.
+    populateFields(); // Depends on Types, and Strings.
+    populateProtos(); // Depends on Types and Strings.
+    populateMethods(); // Depends on Protos, Types, and Strings.
     populateMethodHandles(); // Depends on Methods and Fields
     populateCallSites(); // Depends on MethodHandles
   }
@@ -1176,9 +1192,8 @@
    * From https://source.android.com/devices/tech/dalvik/dex-format#file-layout:
    *
    * <p>This list must be sorted, where the defining type (by type_id index) is the major order,
-   * method name (by string_id index) is the intermediate order, and method prototype
-   * (by proto_id index) is the minor order. The list must not contain any duplicate entries.
-   *
+   * method name (by string_id index) is the intermediate order, and method prototype (by proto_id
+   * index) is the minor order. The list must not contain any duplicate entries.
    */
   private boolean verifyOrderOfMethodIds(DexSection dexSection) {
     if (dexSection.length >= 2) {
@@ -1288,18 +1303,20 @@
       case INSTANCE_GET:
       case INSTANCE_PUT:
       case STATIC_GET:
-      case STATIC_PUT: {
-        fieldOrMethod = indexedItems.getField(indexFieldOrMethod);
-        break;
-      }
+      case STATIC_PUT:
+        {
+          fieldOrMethod = indexedItems.getField(indexFieldOrMethod);
+          break;
+        }
       case INVOKE_CONSTRUCTOR:
       case INVOKE_DIRECT:
       case INVOKE_INTERFACE:
       case INVOKE_INSTANCE:
-      case INVOKE_STATIC: {
-        fieldOrMethod = indexedItems.getMethod(indexFieldOrMethod);
-        break;
-      }
+      case INVOKE_STATIC:
+        {
+          fieldOrMethod = indexedItems.getMethod(indexFieldOrMethod);
+          break;
+        }
       default:
         throw new AssertionError("Method handle type unsupported in a dex file.");
     }
@@ -1367,15 +1384,15 @@
     private static final DexParameterAnnotation[] NO_PARAMETER_ANNOTATIONS =
         new DexParameterAnnotation[0];
 
-    private static final DexFieldAnnotation[] NO_FIELD_ANNOTATIONS =
-        new DexFieldAnnotation[0];
+    private static final DexFieldAnnotation[] NO_FIELD_ANNOTATIONS = new DexFieldAnnotation[0];
 
-    private static final DexMethodAnnotation[] NO_METHOD_ANNOTATIONS =
-        new DexMethodAnnotation[0];
+    private static final DexMethodAnnotation[] NO_METHOD_ANNOTATIONS = new DexMethodAnnotation[0];
 
     private static final AnnotationsDirectory THE_EMPTY_ANNOTATIONS_DIRECTORY =
-        new AnnotationsDirectory(DexAnnotationSet.empty(),
-            NO_FIELD_ANNOTATIONS, new DexMethodAnnotation[0],
+        new AnnotationsDirectory(
+            DexAnnotationSet.empty(),
+            NO_FIELD_ANNOTATIONS,
+            new DexMethodAnnotation[0],
             NO_PARAMETER_ANNOTATIONS);
 
     public final DexAnnotationSet clazz;
@@ -1383,7 +1400,8 @@
     public final DexMethodAnnotation[] methods;
     public final DexParameterAnnotation[] parameters;
 
-    AnnotationsDirectory(DexAnnotationSet clazz,
+    AnnotationsDirectory(
+        DexAnnotationSet clazz,
         DexFieldAnnotation[] fields,
         DexMethodAnnotation[] methods,
         DexParameterAnnotation[] parameters) {
diff --git a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
index fc3784f..785158d 100644
--- a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
+++ b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
@@ -6,29 +6,29 @@
 import static com.android.tools.r8.graph.DexCode.TryHandler.NO_HANDLER;
 import static com.android.tools.r8.graph.DexDebugEventBuilder.addDefaultEventWithAdvancePcIfNecessary;
 
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.ConstStringJumbo;
-import com.android.tools.r8.code.Format21t;
-import com.android.tools.r8.code.Format22t;
-import com.android.tools.r8.code.Format31t;
-import com.android.tools.r8.code.Goto;
-import com.android.tools.r8.code.Goto16;
-import com.android.tools.r8.code.Goto32;
-import com.android.tools.r8.code.IfEq;
-import com.android.tools.r8.code.IfEqz;
-import com.android.tools.r8.code.IfGe;
-import com.android.tools.r8.code.IfGez;
-import com.android.tools.r8.code.IfGt;
-import com.android.tools.r8.code.IfGtz;
-import com.android.tools.r8.code.IfLe;
-import com.android.tools.r8.code.IfLez;
-import com.android.tools.r8.code.IfLt;
-import com.android.tools.r8.code.IfLtz;
-import com.android.tools.r8.code.IfNe;
-import com.android.tools.r8.code.IfNez;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.Nop;
-import com.android.tools.r8.code.SwitchPayload;
+import com.android.tools.r8.dex.code.DexConstString;
+import com.android.tools.r8.dex.code.DexConstStringJumbo;
+import com.android.tools.r8.dex.code.DexFormat21t;
+import com.android.tools.r8.dex.code.DexFormat22t;
+import com.android.tools.r8.dex.code.DexFormat31t;
+import com.android.tools.r8.dex.code.DexGoto;
+import com.android.tools.r8.dex.code.DexGoto16;
+import com.android.tools.r8.dex.code.DexGoto32;
+import com.android.tools.r8.dex.code.DexIfEq;
+import com.android.tools.r8.dex.code.DexIfEqz;
+import com.android.tools.r8.dex.code.DexIfGe;
+import com.android.tools.r8.dex.code.DexIfGez;
+import com.android.tools.r8.dex.code.DexIfGt;
+import com.android.tools.r8.dex.code.DexIfGtz;
+import com.android.tools.r8.dex.code.DexIfLe;
+import com.android.tools.r8.dex.code.DexIfLez;
+import com.android.tools.r8.dex.code.DexIfLt;
+import com.android.tools.r8.dex.code.DexIfLtz;
+import com.android.tools.r8.dex.code.DexIfNe;
+import com.android.tools.r8.dex.code.DexIfNez;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexNop;
+import com.android.tools.r8.dex.code.DexSwitchPayload;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexCode.Try;
 import com.android.tools.r8.graph.DexCode.TryHandler;
@@ -57,11 +57,11 @@
 public class JumboStringRewriter {
 
   private static class TryTargets {
-    private Instruction start;
-    private Instruction end;
+    private DexInstruction start;
+    private DexInstruction end;
     private final boolean endsAfterLastInstruction;
 
-    TryTargets(Instruction start, Instruction end, boolean endsAfterLastInstruction) {
+    TryTargets(DexInstruction start, DexInstruction end, boolean endsAfterLastInstruction) {
       assert start != null;
       assert end != null;
       this.start = start;
@@ -69,7 +69,7 @@
       this.endsAfterLastInstruction = endsAfterLastInstruction;
     }
 
-    void replaceTarget(Instruction target, Instruction newTarget) {
+    void replaceTarget(DexInstruction target, DexInstruction newTarget) {
       if (start == target) {
         start = newTarget;
       }
@@ -93,14 +93,16 @@
   private final DexEncodedMethod method;
   private final DexString firstJumboString;
   private final DexItemFactory factory;
-  private final Map<Instruction, List<Instruction>> instructionTargets = new IdentityHashMap<>();
+  private final Map<DexInstruction, List<DexInstruction>> instructionTargets =
+      new IdentityHashMap<>();
   private EventBasedDebugInfo debugEventBasedInfo = null;
-  private final Int2ReferenceMap<Instruction> debugEventTargets = new Int2ReferenceOpenHashMap<>();
-  private final Map<Instruction, Instruction> payloadToSwitch = new IdentityHashMap<>();
+  private final Int2ReferenceMap<DexInstruction> debugEventTargets =
+      new Int2ReferenceOpenHashMap<>();
+  private final Map<DexInstruction, DexInstruction> payloadToSwitch = new IdentityHashMap<>();
   private final Map<Try, TryTargets> tryTargets = new IdentityHashMap<>();
-  private final Int2ReferenceMap<Instruction> tryRangeStartAndEndTargets
-      = new Int2ReferenceOpenHashMap<>();
-  private final Map<TryHandler, List<Instruction>> handlerTargets = new IdentityHashMap<>();
+  private final Int2ReferenceMap<DexInstruction> tryRangeStartAndEndTargets =
+      new Int2ReferenceOpenHashMap<>();
+  private final Map<TryHandler, List<DexInstruction>> handlerTargets = new IdentityHashMap<>();
 
   public JumboStringRewriter(
       DexEncodedMethod method, DexString firstJumboString, DexItemFactory factory) {
@@ -114,7 +116,7 @@
     // instructions to the actual instruction referenced.
     recordTargets();
     // Expand the code by rewriting jumbo strings and branching instructions.
-    List<Instruction> newInstructions = expandCode();
+    List<DexInstruction> newInstructions = expandCode();
     // Commit to the new instruction offsets and update instructions, try-catch structures
     // and debug info with the new offsets.
     rewriteInstructionOffsets(newInstructions);
@@ -128,7 +130,7 @@
             oldCode.registerSize,
             oldCode.incomingRegisterSize,
             oldCode.outgoingRegisterSize,
-            newInstructions.toArray(Instruction.EMPTY_ARRAY),
+            newInstructions.toArray(DexInstruction.EMPTY_ARRAY),
             newTries,
             newHandlers,
             newDebugInfo);
@@ -138,44 +140,44 @@
     return newCode;
   }
 
-  private void rewriteInstructionOffsets(List<Instruction> instructions) {
-    for (Instruction instruction : instructions) {
-      if (instruction instanceof Format22t) {  // IfEq, IfGe, IfGt, IfLe, IfLt, IfNe
-        Format22t condition = (Format22t) instruction;
+  private void rewriteInstructionOffsets(List<DexInstruction> instructions) {
+    for (DexInstruction instruction : instructions) {
+      if (instruction instanceof DexFormat22t) { // IfEq, IfGe, IfGt, IfLe, IfLt, IfNe
+        DexFormat22t condition = (DexFormat22t) instruction;
         int offset = instructionTargets.get(condition).get(0).getOffset() - instruction.getOffset();
         assert Short.MIN_VALUE <= offset && offset <= Short.MAX_VALUE;
         condition.CCCC = (short) offset;
-      } else if (instruction instanceof Format21t) {  // IfEqz, IfGez, IfGtz, IfLez, IfLtz, IfNez
-        Format21t condition = (Format21t) instruction;
+      } else if (instruction instanceof DexFormat21t) { // IfEqz, IfGez, IfGtz, IfLez, IfLtz, IfNez
+        DexFormat21t condition = (DexFormat21t) instruction;
         int offset = instructionTargets.get(condition).get(0).getOffset() - instruction.getOffset();
         assert Short.MIN_VALUE <= offset && offset <= Short.MAX_VALUE;
         condition.BBBB = (short) offset;
-      } else if (instruction instanceof Goto) {
-        Goto jump = (Goto) instruction;
+      } else if (instruction instanceof DexGoto) {
+        DexGoto jump = (DexGoto) instruction;
         int offset = instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset();
         assert Byte.MIN_VALUE <= offset && offset <= Byte.MAX_VALUE;
         jump.AA = (byte) offset;
-      } else if (instruction instanceof Goto16) {
-        Goto16 jump = (Goto16) instruction;
+      } else if (instruction instanceof DexGoto16) {
+        DexGoto16 jump = (DexGoto16) instruction;
         int offset = instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset();
         assert Short.MIN_VALUE <= offset && offset <= Short.MAX_VALUE;
         jump.AAAA = (short) offset;
-      } else if (instruction instanceof Goto32) {
-        Goto32 jump = (Goto32) instruction;
+      } else if (instruction instanceof DexGoto32) {
+        DexGoto32 jump = (DexGoto32) instruction;
         int offset = instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset();
         jump.AAAAAAAA = offset;
-      } else if (instruction.hasPayload()) {  // FillArrayData, SparseSwitch, PackedSwitch
-        Format31t payloadUser = (Format31t) instruction;
+      } else if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch
+        DexFormat31t payloadUser = (DexFormat31t) instruction;
         int offset =
             instructionTargets.get(payloadUser).get(0).getOffset() - instruction.getOffset();
         payloadUser.setPayloadOffset(offset);
-      } else if (instruction instanceof SwitchPayload) {
-        SwitchPayload payload = (SwitchPayload) instruction;
-        Instruction switchInstruction = payloadToSwitch.get(payload);
-        List<Instruction> switchTargets = instructionTargets.get(payload);
+      } else if (instruction instanceof DexSwitchPayload) {
+        DexSwitchPayload payload = (DexSwitchPayload) instruction;
+        DexInstruction switchInstruction = payloadToSwitch.get(payload);
+        List<DexInstruction> switchTargets = instructionTargets.get(payload);
         int[] targets = payload.switchTargetOffsets();
         for (int i = 0; i < switchTargets.size(); i++) {
-          Instruction target = switchTargets.get(i);
+          DexInstruction target = switchTargets.get(i);
           targets[i] = target.getOffset() - switchInstruction.getOffset();
         }
       }
@@ -199,8 +201,8 @@
     TryHandler[] result = new TryHandler[code.handlers.length];
     for (int i = 0; i < code.handlers.length; i++) {
       TryHandler handler = code.handlers[i];
-      List<Instruction> targets = handlerTargets.get(handler);
-      Iterator<Instruction> it = targets.iterator();
+      List<DexInstruction> targets = handlerTargets.get(handler);
+      Iterator<DexInstruction> it = targets.iterator();
       int catchAllAddr = NO_HANDLER;
       if (handler.catchAllAddr != NO_HANDLER) {
         catchAllAddr = it.next().getOffset();
@@ -226,14 +228,14 @@
         if (event instanceof AdvancePC) {
           AdvancePC advance = (AdvancePC) event;
           lastOriginalOffset += advance.delta;
-          Instruction target = debugEventTargets.get(lastOriginalOffset);
+          DexInstruction target = debugEventTargets.get(lastOriginalOffset);
           int pcDelta = target.getOffset() - lastNewOffset;
           events.add(factory.createAdvancePC(pcDelta));
           lastNewOffset = target.getOffset();
         } else if (event instanceof Default) {
           Default defaultEvent = (Default) event;
           lastOriginalOffset += defaultEvent.getPCDelta();
-          Instruction target = debugEventTargets.get(lastOriginalOffset);
+          DexInstruction target = debugEventTargets.get(lastOriginalOffset);
           int lineDelta = defaultEvent.getLineDelta();
           int pcDelta = target.getOffset() - lastNewOffset;
           addDefaultEventWithAdvancePcIfNecessary(lineDelta, pcDelta, events, factory);
@@ -250,116 +252,116 @@
     return code.getDebugInfo();
   }
 
-  private List<Instruction> expandCode() {
-    LinkedList<Instruction> instructions = new LinkedList<>();
+  private List<DexInstruction> expandCode() {
+    LinkedList<DexInstruction> instructions = new LinkedList<>();
     Collections.addAll(instructions, method.getCode().asDexCode().instructions);
     int offsetDelta;
     do {
-      ListIterator<Instruction> it = instructions.listIterator();
+      ListIterator<DexInstruction> it = instructions.listIterator();
       offsetDelta = 0;
       while (it.hasNext()) {
-        Instruction instruction = it.next();
+        DexInstruction instruction = it.next();
         int orignalOffset = instruction.getOffset();
         instruction.setOffset(orignalOffset + offsetDelta);
-        if (instruction instanceof ConstString) {
-          ConstString string = (ConstString) instruction;
+        if (instruction instanceof DexConstString) {
+          DexConstString string = (DexConstString) instruction;
           if (string.getString().compareTo(firstJumboString) >= 0) {
-            ConstStringJumbo jumboString = new ConstStringJumbo(string.AA, string.getString());
+            DexConstStringJumbo jumboString =
+                new DexConstStringJumbo(string.AA, string.getString());
             jumboString.setOffset(string.getOffset());
             offsetDelta++;
             it.set(jumboString);
             replaceTarget(instruction, jumboString);
           }
-        } else if (instruction instanceof Format22t) {  // IfEq, IfGe, IfGt, IfLe, IfLt, IfNe
-          Format22t condition = (Format22t) instruction;
+        } else if (instruction instanceof DexFormat22t) { // IfEq, IfGe, IfGt, IfLe, IfLt, IfNe
+          DexFormat22t condition = (DexFormat22t) instruction;
           int offset =
               instructionTargets.get(condition).get(0).getOffset() - instruction.getOffset();
           if (Short.MIN_VALUE > offset || offset > Short.MAX_VALUE) {
-            Format22t newCondition = null;
+            DexFormat22t newCondition = null;
             switch (condition.getType().inverted()) {
               case EQ:
-                newCondition = new IfEq(condition.A, condition.B, 0);
+                newCondition = new DexIfEq(condition.A, condition.B, 0);
                 break;
               case GE:
-                newCondition = new IfGe(condition.A, condition.B, 0);
+                newCondition = new DexIfGe(condition.A, condition.B, 0);
                 break;
               case GT:
-                newCondition = new IfGt(condition.A, condition.B, 0);
+                newCondition = new DexIfGt(condition.A, condition.B, 0);
                 break;
               case LE:
-                newCondition = new IfLe(condition.A, condition.B, 0);
+                newCondition = new DexIfLe(condition.A, condition.B, 0);
                 break;
               case LT:
-                newCondition = new IfLt(condition.A, condition.B, 0);
+                newCondition = new DexIfLt(condition.A, condition.B, 0);
                 break;
               case NE:
-                newCondition = new IfNe(condition.A, condition.B, 0);
+                newCondition = new DexIfNe(condition.A, condition.B, 0);
                 break;
             }
             offsetDelta = rewriteIfToIfAndGoto(offsetDelta, it, condition, newCondition);
           }
-        } else if (instruction instanceof Format21t) {  // IfEqz, IfGez, IfGtz, IfLez, IfLtz, IfNez
-          Format21t condition = (Format21t) instruction;
+        } else if (instruction
+            instanceof DexFormat21t) { // IfEqz, IfGez, IfGtz, IfLez, IfLtz, IfNez
+          DexFormat21t condition = (DexFormat21t) instruction;
           int offset =
               instructionTargets.get(condition).get(0).getOffset() - instruction.getOffset();
           if (Short.MIN_VALUE > offset || offset > Short.MAX_VALUE) {
-            Format21t newCondition = null;
+            DexFormat21t newCondition = null;
             switch (condition.getType().inverted()) {
               case EQ:
-                newCondition = new IfEqz(condition.AA, 0);
+                newCondition = new DexIfEqz(condition.AA, 0);
                 break;
               case GE:
-                newCondition = new IfGez(condition.AA, 0);
+                newCondition = new DexIfGez(condition.AA, 0);
                 break;
               case GT:
-                newCondition = new IfGtz(condition.AA, 0);
+                newCondition = new DexIfGtz(condition.AA, 0);
                 break;
               case LE:
-                newCondition = new IfLez(condition.AA, 0);
+                newCondition = new DexIfLez(condition.AA, 0);
                 break;
               case LT:
-                newCondition = new IfLtz(condition.AA, 0);
+                newCondition = new DexIfLtz(condition.AA, 0);
                 break;
               case NE:
-                newCondition = new IfNez(condition.AA, 0);
+                newCondition = new DexIfNez(condition.AA, 0);
                 break;
             }
             offsetDelta = rewriteIfToIfAndGoto(offsetDelta, it, condition, newCondition);
           }
-        } else if (instruction instanceof Goto) {
-          Goto jump = (Goto) instruction;
-          int offset =
-              instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset();
+        } else if (instruction instanceof DexGoto) {
+          DexGoto jump = (DexGoto) instruction;
+          int offset = instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset();
           if (Byte.MIN_VALUE > offset || offset > Byte.MAX_VALUE) {
-            Instruction newJump;
+            DexInstruction newJump;
             if (Short.MIN_VALUE > offset || offset > Short.MAX_VALUE) {
-              newJump = new Goto32(offset);
+              newJump = new DexGoto32(offset);
             } else {
-              newJump = new Goto16(offset);
+              newJump = new DexGoto16(offset);
             }
             newJump.setOffset(jump.getOffset());
             it.set(newJump);
             offsetDelta += (newJump.getSize() - jump.getSize());
             replaceTarget(jump, newJump);
-            List<Instruction> targets = instructionTargets.remove(jump);
+            List<DexInstruction> targets = instructionTargets.remove(jump);
             instructionTargets.put(newJump, targets);
           }
-        } else if (instruction instanceof Goto16) {
-          Goto16 jump = (Goto16) instruction;
-          int offset =
-              instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset();
+        } else if (instruction instanceof DexGoto16) {
+          DexGoto16 jump = (DexGoto16) instruction;
+          int offset = instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset();
           if (Short.MIN_VALUE > offset || offset > Short.MAX_VALUE) {
-            Instruction newJump = new Goto32(offset);
+            DexInstruction newJump = new DexGoto32(offset);
             newJump.setOffset(jump.getOffset());
             it.set(newJump);
             offsetDelta += (newJump.getSize() - jump.getSize());
             replaceTarget(jump, newJump);
-            List<Instruction> targets = instructionTargets.remove(jump);
+            List<DexInstruction> targets = instructionTargets.remove(jump);
             instructionTargets.put(newJump, targets);
           }
-        } else if (instruction instanceof Goto32) {
+        } else if (instruction instanceof DexGoto32) {
           // Instruction big enough for any offset.
-        } else if (instruction.hasPayload()) {  // FillArrayData, SparseSwitch, PackedSwitch
+        } else if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch
           // Instruction big enough for any offset.
         } else if (instruction.isPayload()) {
           // Payload instructions must be 4 byte aligned (instructions are 2 bytes).
@@ -368,7 +370,7 @@
             // Check if the previous instruction was a simple nop. If that is the case, remove it
             // to make the alignment instead of adding another one. Only allow removal if this
             // instruction is not targeted by anything. See b/78072750.
-            Instruction instructionBeforePayload = it.hasPrevious() ? it.previous() : null;
+            DexInstruction instructionBeforePayload = it.hasPrevious() ? it.previous() : null;
             if (instructionBeforePayload != null
                 && instructionBeforePayload.isSimpleNop()
                 && debugEventTargets.get(orignalOffset) == null
@@ -379,7 +381,7 @@
               if (instructionBeforePayload != null) {
                 it.next();
               }
-              Nop nop = new Nop();
+              DexNop nop = new DexNop();
               nop.setOffset(instruction.getOffset());
               it.add(nop);
               offsetDelta++;
@@ -396,11 +398,11 @@
 
   private int rewriteIfToIfAndGoto(
       int offsetDelta,
-      ListIterator<Instruction> it,
-      Instruction condition,
-      Instruction newCondition) {
+      ListIterator<DexInstruction> it,
+      DexInstruction condition,
+      DexInstruction newCondition) {
     int jumpOffset = condition.getOffset() + condition.getSize();
-    Goto32 jump = new Goto32(0);
+    DexGoto32 jump = new DexGoto32(0);
     jump.setOffset(jumpOffset);
     newCondition.setOffset(condition.getOffset());
     it.set(newCondition);
@@ -408,17 +410,17 @@
     it.add(jump);
     offsetDelta += jump.getSize();
     instructionTargets.put(jump, instructionTargets.remove(condition));
-    Instruction fallthroughInstruction = it.next();
+    DexInstruction fallthroughInstruction = it.next();
     instructionTargets.put(newCondition, Lists.newArrayList(fallthroughInstruction));
     it.previous();
     return offsetDelta;
   }
 
-  private void replaceTarget(Instruction target, Instruction newTarget) {
-    for (List<Instruction> instructions : instructionTargets.values()) {
+  private void replaceTarget(DexInstruction target, DexInstruction newTarget) {
+    for (List<DexInstruction> instructions : instructionTargets.values()) {
       instructions.replaceAll((i) -> i == target ? newTarget : i);
     }
-    for (Int2ReferenceMap.Entry<Instruction> entry : debugEventTargets.int2ReferenceEntrySet()) {
+    for (Int2ReferenceMap.Entry<DexInstruction> entry : debugEventTargets.int2ReferenceEntrySet()) {
       if (entry.getValue() == target) {
         entry.setValue(newTarget);
       }
@@ -426,52 +428,53 @@
     for (Entry<Try, TryTargets> entry : tryTargets.entrySet()) {
       entry.getValue().replaceTarget(target, newTarget);
     }
-    for (List<Instruction> instructions : handlerTargets.values()) {
+    for (List<DexInstruction> instructions : handlerTargets.values()) {
       instructions.replaceAll((i) -> i == target ? newTarget : i);
     }
   }
 
-  private void recordInstructionTargets(Int2ReferenceMap<Instruction> offsetToInstruction) {
-    Instruction[] instructions = method.getCode().asDexCode().instructions;
-    for (Instruction instruction : instructions) {
-      if (instruction instanceof Format22t) {  // IfEq, IfGe, IfGt, IfLe, IfLt, IfNe
-        Format22t condition = (Format22t) instruction;
-        Instruction target = offsetToInstruction.get(condition.getOffset() + condition.CCCC);
+  private void recordInstructionTargets(Int2ReferenceMap<DexInstruction> offsetToInstruction) {
+    DexInstruction[] instructions = method.getCode().asDexCode().instructions;
+    for (DexInstruction instruction : instructions) {
+      if (instruction instanceof DexFormat22t) { // IfEq, IfGe, IfGt, IfLe, IfLt, IfNe
+        DexFormat22t condition = (DexFormat22t) instruction;
+        DexInstruction target = offsetToInstruction.get(condition.getOffset() + condition.CCCC);
         assert target != null;
         instructionTargets.put(instruction, Lists.newArrayList(target));
-      } else if (instruction instanceof Format21t) {  // IfEqz, IfGez, IfGtz, IfLez, IfLtz, IfNez
-        Format21t condition = (Format21t) instruction;
-        Instruction target = offsetToInstruction.get(condition.getOffset() + condition.BBBB);
+      } else if (instruction instanceof DexFormat21t) { // IfEqz, IfGez, IfGtz, IfLez, IfLtz, IfNez
+        DexFormat21t condition = (DexFormat21t) instruction;
+        DexInstruction target = offsetToInstruction.get(condition.getOffset() + condition.BBBB);
         assert target != null;
         instructionTargets.put(instruction, Lists.newArrayList(target));
-      } else if (instruction instanceof Goto) {
-        Goto jump = (Goto) instruction;
-        Instruction target = offsetToInstruction.get(jump.getOffset() + jump.AA);
+      } else if (instruction instanceof DexGoto) {
+        DexGoto jump = (DexGoto) instruction;
+        DexInstruction target = offsetToInstruction.get(jump.getOffset() + jump.AA);
         assert target != null;
         instructionTargets.put(instruction, Lists.newArrayList(target));
-      } else if (instruction instanceof Goto16) {
-        Goto16 jump = (Goto16) instruction;
-        Instruction target = offsetToInstruction.get(jump.getOffset() + jump.AAAA);
+      } else if (instruction instanceof DexGoto16) {
+        DexGoto16 jump = (DexGoto16) instruction;
+        DexInstruction target = offsetToInstruction.get(jump.getOffset() + jump.AAAA);
         assert target != null;
         instructionTargets.put(instruction, Lists.newArrayList(target));
-      } else if (instruction instanceof Goto32) {
-        Goto32 jump = (Goto32) instruction;
-        Instruction target = offsetToInstruction.get(jump.getOffset() + jump.AAAAAAAA);
+      } else if (instruction instanceof DexGoto32) {
+        DexGoto32 jump = (DexGoto32) instruction;
+        DexInstruction target = offsetToInstruction.get(jump.getOffset() + jump.AAAAAAAA);
         assert target != null;
         instructionTargets.put(instruction, Lists.newArrayList(target));
-      } else if (instruction.hasPayload()) {  // FillArrayData, SparseSwitch, PackedSwitch
-        Format31t offsetInstruction = (Format31t) instruction;
-        Instruction target = offsetToInstruction.get(
-            offsetInstruction.getOffset() + offsetInstruction.getPayloadOffset());
+      } else if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch
+        DexFormat31t offsetInstruction = (DexFormat31t) instruction;
+        DexInstruction target =
+            offsetToInstruction.get(
+                offsetInstruction.getOffset() + offsetInstruction.getPayloadOffset());
         assert target != null;
         instructionTargets.put(instruction, Lists.newArrayList(target));
-      } else if (instruction instanceof SwitchPayload) {
-        SwitchPayload payload = (SwitchPayload) instruction;
+      } else if (instruction instanceof DexSwitchPayload) {
+        DexSwitchPayload payload = (DexSwitchPayload) instruction;
         int[] targetOffsets = payload.switchTargetOffsets();
         int switchOffset = payloadToSwitch.get(instruction).getOffset();
-        List<Instruction> targets = new ArrayList<>();
+        List<DexInstruction> targets = new ArrayList<>();
         for (int i = 0; i < targetOffsets.length; i++) {
-          Instruction target = offsetToInstruction.get(switchOffset + targetOffsets[i]);
+          DexInstruction target = offsetToInstruction.get(switchOffset + targetOffsets[i]);
           assert target != null;
           targets.add(target);
         }
@@ -480,7 +483,7 @@
     }
   }
 
-  private void recordDebugEventTargets(Int2ReferenceMap<Instruction> offsetToInstruction) {
+  private void recordDebugEventTargets(Int2ReferenceMap<DexInstruction> offsetToInstruction) {
     // TODO(b/213411850): Merging pc based D8 builds will map out of PC for any jumbo processed
     //  method. Instead we should rather retain the PC encoding by bumping the max-pc and recording
     //  the line number translation. We actually need to do so to support merging with native PC
@@ -496,13 +499,13 @@
       if (event instanceof AdvancePC) {
         AdvancePC advance = (AdvancePC) event;
         address += advance.delta;
-        Instruction target = offsetToInstruction.get(address);
+        DexInstruction target = offsetToInstruction.get(address);
         assert target != null;
         debugEventTargets.put(address, target);
       } else if (event instanceof Default) {
         Default defaultEvent = (Default) event;
         address += defaultEvent.getPCDelta();
-        Instruction target = offsetToInstruction.get(address);
+        DexInstruction target = offsetToInstruction.get(address);
         assert target != null;
         debugEventTargets.put(address, target);
       }
@@ -510,12 +513,11 @@
   }
 
   private void recordTryAndHandlerTargets(
-      Int2ReferenceMap<Instruction> offsetToInstruction,
-      Instruction lastInstruction) {
+      Int2ReferenceMap<DexInstruction> offsetToInstruction, DexInstruction lastInstruction) {
     DexCode code = method.getCode().asDexCode();
     for (Try theTry : code.tries) {
-      Instruction start = offsetToInstruction.get(theTry.startAddress);
-      Instruction end = null;
+      DexInstruction start = offsetToInstruction.get(theTry.startAddress);
+      DexInstruction end = null;
       int endAddress = theTry.startAddress + theTry.instructionCount;
       TryTargets targets;
       if (endAddress > lastInstruction.getOffset()) {
@@ -532,14 +534,14 @@
       tryRangeStartAndEndTargets.put(end.getOffset(), end);
     }
     for (TryHandler handler : code.handlers) {
-      List<Instruction> targets = new ArrayList<>();
+      List<DexInstruction> targets = new ArrayList<>();
       if (handler.catchAllAddr != NO_HANDLER) {
-        Instruction target = offsetToInstruction.get(handler.catchAllAddr);
+        DexInstruction target = offsetToInstruction.get(handler.catchAllAddr);
         assert target != null;
         targets.add(target);
       }
       for (TypeAddrPair pair : handler.pairs) {
-        Instruction target = offsetToInstruction.get(pair.addr);
+        DexInstruction target = offsetToInstruction.get(pair.addr);
         assert target != null;
         targets.add(target);
       }
@@ -548,19 +550,19 @@
   }
 
   private void recordTargets() {
-    Int2ReferenceMap<Instruction> offsetToInstruction = new Int2ReferenceOpenHashMap<>();
-    Instruction[] instructions = method.getCode().asDexCode().instructions;
+    Int2ReferenceMap<DexInstruction> offsetToInstruction = new Int2ReferenceOpenHashMap<>();
+    DexInstruction[] instructions = method.getCode().asDexCode().instructions;
     boolean containsPayloads = false;
-    for (Instruction instruction : instructions) {
+    for (DexInstruction instruction : instructions) {
       offsetToInstruction.put(instruction.getOffset(), instruction);
-      if (instruction.hasPayload()) {  // FillArrayData, SparseSwitch, PackedSwitch
+      if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch
         containsPayloads = true;
       }
     }
     if (containsPayloads) {
-      for (Instruction instruction : instructions) {
-        if (instruction.hasPayload()) {  // FillArrayData, SparseSwitch, PackedSwitch
-          Instruction payload =
+      for (DexInstruction instruction : instructions) {
+        if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch
+          DexInstruction payload =
               offsetToInstruction.get(instruction.getOffset() + instruction.getPayloadOffset());
           assert payload != null;
           payloadToSwitch.put(payload, instruction);
@@ -569,7 +571,7 @@
     }
     recordInstructionTargets(offsetToInstruction);
     recordDebugEventTargets(offsetToInstruction);
-    Instruction lastInstruction = instructions[instructions.length - 1];
+    DexInstruction lastInstruction = instructions[instructions.length - 1];
     recordTryAndHandlerTargets(offsetToInstruction, lastInstruction);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/BytecodeStream.java b/src/main/java/com/android/tools/r8/dex/code/BytecodeStream.java
similarity index 87%
rename from src/main/java/com/android/tools/r8/code/BytecodeStream.java
rename to src/main/java/com/android/tools/r8/dex/code/BytecodeStream.java
index e928c3e..da1e31a 100644
--- a/src/main/java/com/android/tools/r8/code/BytecodeStream.java
+++ b/src/main/java/com/android/tools/r8/dex/code/BytecodeStream.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 public interface BytecodeStream {
 
@@ -23,7 +23,7 @@
    * Returns the next byte value from the stream, i.e., the high value of the next short followed by
    * the low value.
    *
-   * Both bytes need to be consumed before the next call to {@link #nextShort()}.
+   * <p>Both bytes need to be consumed before the next call to {@link #nextShort()}.
    *
    * @return next byte value in the stream.
    */
diff --git a/src/main/java/com/android/tools/r8/code/CfOrDexInstanceFieldRead.java b/src/main/java/com/android/tools/r8/dex/code/CfOrDexInstanceFieldRead.java
similarity index 89%
rename from src/main/java/com/android/tools/r8/code/CfOrDexInstanceFieldRead.java
rename to src/main/java/com/android/tools/r8/dex/code/CfOrDexInstanceFieldRead.java
index 3d560fc..4d4d9bc 100644
--- a/src/main/java/com/android/tools/r8/code/CfOrDexInstanceFieldRead.java
+++ b/src/main/java/com/android/tools/r8/dex/code/CfOrDexInstanceFieldRead.java
@@ -2,7 +2,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 
diff --git a/src/main/java/com/android/tools/r8/code/CfOrDexInstruction.java b/src/main/java/com/android/tools/r8/dex/code/CfOrDexInstruction.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/CfOrDexInstruction.java
rename to src/main/java/com/android/tools/r8/dex/code/CfOrDexInstruction.java
index e8ac111..7bd1e7a 100644
--- a/src/main/java/com/android/tools/r8/code/CfOrDexInstruction.java
+++ b/src/main/java/com/android/tools/r8/dex/code/CfOrDexInstruction.java
@@ -2,7 +2,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.cf.code.CfInstruction;
 
@@ -12,5 +12,5 @@
 
   boolean isCfInstruction();
 
-  Instruction asDexInstruction();
+  DexInstruction asDexInstruction();
 }
diff --git a/src/main/java/com/android/tools/r8/code/CfOrDexStaticFieldRead.java b/src/main/java/com/android/tools/r8/dex/code/CfOrDexStaticFieldRead.java
similarity index 89%
rename from src/main/java/com/android/tools/r8/code/CfOrDexStaticFieldRead.java
rename to src/main/java/com/android/tools/r8/dex/code/CfOrDexStaticFieldRead.java
index 121023a..513543c 100644
--- a/src/main/java/com/android/tools/r8/code/CfOrDexStaticFieldRead.java
+++ b/src/main/java/com/android/tools/r8/dex/code/CfOrDexStaticFieldRead.java
@@ -2,7 +2,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 
diff --git a/src/main/java/com/android/tools/r8/code/AddDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexAddDouble.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AddDouble.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAddDouble.java
index ce962e2..d78dcbd 100644
--- a/src/main/java/com/android/tools/r8/code/AddDouble.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAddDouble.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class AddDouble extends Format23x {
+
+public class DexAddDouble extends DexFormat23x {
 
   public static final int OPCODE = 0xab;
   public static final String NAME = "AddDouble";
   public static final String SMALI_NAME = "add-double";
 
-  AddDouble(int high, BytecodeStream stream) {
+  DexAddDouble(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AddDouble(int dest, int left, int right) {
+  public DexAddDouble(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AddDouble2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexAddDouble2Addr.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/AddDouble2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAddDouble2Addr.java
index a5a907b..c641b5f 100644
--- a/src/main/java/com/android/tools/r8/code/AddDouble2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAddDouble2Addr.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class AddDouble2Addr extends Format12x {
+
+public class DexAddDouble2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xcb;
   public static final String NAME = "AddDouble2Addr";
   public static final String SMALI_NAME = "add-double/2addr";
 
-  AddDouble2Addr(int high, BytecodeStream stream) {
+  DexAddDouble2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AddDouble2Addr(int left, int right) {
+  public DexAddDouble2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AddFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexAddFloat.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AddFloat.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAddFloat.java
index 2d255ea..e745b30 100644
--- a/src/main/java/com/android/tools/r8/code/AddFloat.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAddFloat.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AddFloat extends Format23x {
+public class DexAddFloat extends DexFormat23x {
 
   public static final int OPCODE = 0xa6;
   public static final String NAME = "AddFloat";
   public static final String SMALI_NAME = "add-float";
 
-  AddFloat(int high, BytecodeStream stream) {
+  DexAddFloat(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AddFloat(int dest, int left, int right) {
+  public DexAddFloat(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AddFloat2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexAddFloat2Addr.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/AddFloat2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAddFloat2Addr.java
index 0fb4691..e232cae 100644
--- a/src/main/java/com/android/tools/r8/code/AddFloat2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAddFloat2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AddFloat2Addr extends Format12x {
+public class DexAddFloat2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xc6;
   public static final String NAME = "AddFloat2Addr";
   public static final String SMALI_NAME = "add-float/2addr";
 
-  AddFloat2Addr(int high, BytecodeStream stream) {
+  DexAddFloat2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AddFloat2Addr(int left, int right) {
+  public DexAddFloat2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AddInt.java b/src/main/java/com/android/tools/r8/dex/code/DexAddInt.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AddInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAddInt.java
index ba05bbf..b9e3d75 100644
--- a/src/main/java/com/android/tools/r8/code/AddInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAddInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AddInt extends Format23x {
+public class DexAddInt extends DexFormat23x {
 
   public static final int OPCODE = 0x90;
   public static final String NAME = "AddInt";
   public static final String SMALI_NAME = "add-int";
 
-  AddInt(int high, BytecodeStream stream) {
+  DexAddInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AddInt(int dest, int left, int right) {
+  public DexAddInt(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AddInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexAddInt2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AddInt2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAddInt2Addr.java
index 1d50caf..cc38583 100644
--- a/src/main/java/com/android/tools/r8/code/AddInt2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAddInt2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AddInt2Addr extends Format12x {
+public class DexAddInt2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xb0;
   public static final String NAME = "AddInt2Addr";
   public static final String SMALI_NAME = "add-int/2addr";
 
-  AddInt2Addr(int high, BytecodeStream stream) {
+  DexAddInt2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AddInt2Addr(int left, int right) {
+  public DexAddInt2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AddIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexAddIntLit16.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/AddIntLit16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAddIntLit16.java
index c05f238..07e6e6a 100644
--- a/src/main/java/com/android/tools/r8/code/AddIntLit16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAddIntLit16.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AddIntLit16 extends Format22s {
+public class DexAddIntLit16 extends DexFormat22s {
 
   public static final int OPCODE = 0xd0;
   public static final String NAME = "AddIntLit16";
   public static final String SMALI_NAME = "add-int/lit16";
 
-  AddIntLit16(int high, BytecodeStream stream) {
+  DexAddIntLit16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AddIntLit16(int dest, int register, int constant) {
+  public DexAddIntLit16(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AddIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexAddIntLit8.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/AddIntLit8.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAddIntLit8.java
index 8715c06..8093253 100644
--- a/src/main/java/com/android/tools/r8/code/AddIntLit8.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAddIntLit8.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AddIntLit8 extends Format22b {
+public class DexAddIntLit8 extends DexFormat22b {
 
   public static final int OPCODE = 0xd8;
   public static final String NAME = "AddIntLit8";
   public static final String SMALI_NAME = "add-int/lit8";
 
-  AddIntLit8(int high, BytecodeStream stream) {
+  DexAddIntLit8(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AddIntLit8(int dest, int register, int constant) {
+  public DexAddIntLit8(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AddLong.java b/src/main/java/com/android/tools/r8/dex/code/DexAddLong.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AddLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAddLong.java
index f3a6e3f..dbb0094 100644
--- a/src/main/java/com/android/tools/r8/code/AddLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAddLong.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class AddLong extends Format23x {
+
+public class DexAddLong extends DexFormat23x {
 
   public static final int OPCODE = 0x9b;
   public static final String NAME = "AddLong";
   public static final String SMALI_NAME = "add-long";
 
-  AddLong(int high, BytecodeStream stream) {
+  DexAddLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AddLong(int dest, int left, int right) {
+  public DexAddLong(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AddLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexAddLong2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AddLong2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAddLong2Addr.java
index 72cb8e6..0d93f58 100644
--- a/src/main/java/com/android/tools/r8/code/AddLong2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAddLong2Addr.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class AddLong2Addr extends Format12x {
+
+public class DexAddLong2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xbb;
   public static final String NAME = "AddLong2Addr";
   public static final String SMALI_NAME = "add-long/2addr";
 
-  AddLong2Addr(int high, BytecodeStream stream) {
+  DexAddLong2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AddLong2Addr(int left, int right) {
+  public DexAddLong2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/Aget.java b/src/main/java/com/android/tools/r8/dex/code/DexAget.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/Aget.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAget.java
index 063df5e..71f365b 100644
--- a/src/main/java/com/android/tools/r8/code/Aget.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAget.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class Aget extends Format23x {
+public class DexAget extends DexFormat23x {
 
   public static final int OPCODE = 0x44;
   public static final String NAME = "Aget";
   public static final String SMALI_NAME = "aget";
 
-  /*package*/ Aget(int high, BytecodeStream stream) {
+  /*package*/ DexAget(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public Aget(int AA, int BB, int CC) {
+  public DexAget(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AgetBoolean.java b/src/main/java/com/android/tools/r8/dex/code/DexAgetBoolean.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/AgetBoolean.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAgetBoolean.java
index fc05007..e969298 100644
--- a/src/main/java/com/android/tools/r8/code/AgetBoolean.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAgetBoolean.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AgetBoolean extends Format23x {
+public class DexAgetBoolean extends DexFormat23x {
 
   public static final int OPCODE = 0x47;
   public static final String NAME = "AgetBoolean";
   public static final String SMALI_NAME = "aget-boolean";
 
-  AgetBoolean(int high, BytecodeStream stream) {
+  DexAgetBoolean(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AgetBoolean(int AA, int BB, int CC) {
+  public DexAgetBoolean(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AgetByte.java b/src/main/java/com/android/tools/r8/dex/code/DexAgetByte.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/AgetByte.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAgetByte.java
index f7bc165..addb35e 100644
--- a/src/main/java/com/android/tools/r8/code/AgetByte.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAgetByte.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AgetByte extends Format23x {
+public class DexAgetByte extends DexFormat23x {
 
   public static final int OPCODE = 0x48;
   public static final String NAME = "AgetByte";
   public static final String SMALI_NAME = "aget-byte";
 
-  /*package*/ AgetByte(int high, BytecodeStream stream) {
+  /*package*/ DexAgetByte(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AgetByte(int AA, int BB, int CC) {
+  public DexAgetByte(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AgetChar.java b/src/main/java/com/android/tools/r8/dex/code/DexAgetChar.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AgetChar.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAgetChar.java
index fc7804e..ed8ac21 100644
--- a/src/main/java/com/android/tools/r8/code/AgetChar.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAgetChar.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AgetChar extends Format23x {
+public class DexAgetChar extends DexFormat23x {
 
   public static final int OPCODE = 0x49;
   public static final String NAME = "AgetChar";
   public static final String SMALI_NAME = "aget-char";
 
-  /*package*/ AgetChar(int high, BytecodeStream stream) {
+  /*package*/ DexAgetChar(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AgetChar(int AA, int BB, int CC) {
+  public DexAgetChar(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AgetObject.java b/src/main/java/com/android/tools/r8/dex/code/DexAgetObject.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/AgetObject.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAgetObject.java
index 1574602..8cbedda 100644
--- a/src/main/java/com/android/tools/r8/code/AgetObject.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAgetObject.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class AgetObject extends Format23x {
+
+public class DexAgetObject extends DexFormat23x {
 
   public static final int OPCODE = 0x46;
   public static final String NAME = "AgetObject";
   public static final String SMALI_NAME = "aget-object";
 
-  AgetObject(int high, BytecodeStream stream) {
+  DexAgetObject(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AgetObject(int AA, int BB, int CC) {
+  public DexAgetObject(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AgetShort.java b/src/main/java/com/android/tools/r8/dex/code/DexAgetShort.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/AgetShort.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAgetShort.java
index d7fb45a..fd887b1 100644
--- a/src/main/java/com/android/tools/r8/code/AgetShort.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAgetShort.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AgetShort extends Format23x {
+public class DexAgetShort extends DexFormat23x {
 
   public static final int OPCODE = 0x4a;
   public static final String NAME = "AgetShort";
   public static final String SMALI_NAME = "aget-short";
 
-  AgetShort(int high, BytecodeStream stream) {
+  DexAgetShort(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AgetShort(int AA, int BB, int CC) {
+  public DexAgetShort(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AgetWide.java b/src/main/java/com/android/tools/r8/dex/code/DexAgetWide.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/AgetWide.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAgetWide.java
index 64c645d..59a0923 100644
--- a/src/main/java/com/android/tools/r8/code/AgetWide.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAgetWide.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AgetWide extends Format23x {
+public class DexAgetWide extends DexFormat23x {
 
   public static final int OPCODE = 0x45;
   public static final String NAME = "AgetWide";
   public static final String SMALI_NAME = "aget-wide";
 
-  /*package*/ AgetWide(int high, BytecodeStream stream) {
+  /*package*/ DexAgetWide(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AgetWide(int AA, int BB, int CC) {
+  public DexAgetWide(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AndInt.java b/src/main/java/com/android/tools/r8/dex/code/DexAndInt.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AndInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAndInt.java
index 532e657..7050380 100644
--- a/src/main/java/com/android/tools/r8/code/AndInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAndInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AndInt extends Format23x {
+public class DexAndInt extends DexFormat23x {
 
   public static final int OPCODE = 0x95;
   public static final String NAME = "AndInt";
   public static final String SMALI_NAME = "and-int";
 
-  AndInt(int high, BytecodeStream stream) {
+  DexAndInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AndInt(int dest, int left, int right) {
+  public DexAndInt(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AndInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexAndInt2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AndInt2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAndInt2Addr.java
index ad29884..8eba630 100644
--- a/src/main/java/com/android/tools/r8/code/AndInt2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAndInt2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AndInt2Addr extends Format12x {
+public class DexAndInt2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xb5;
   public static final String NAME = "AndInt2Addr";
   public static final String SMALI_NAME = "and-int/2addr";
 
-  AndInt2Addr(int high, BytecodeStream stream) {
+  DexAndInt2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AndInt2Addr(int left, int right) {
+  public DexAndInt2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AndIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexAndIntLit16.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/AndIntLit16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAndIntLit16.java
index 8dc59d5..fd68e93 100644
--- a/src/main/java/com/android/tools/r8/code/AndIntLit16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAndIntLit16.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AndIntLit16 extends Format22s {
+public class DexAndIntLit16 extends DexFormat22s {
 
   public static final int OPCODE = 0xd5;
   public static final String NAME = "AndIntLit16";
   public static final String SMALI_NAME = "and-int/lit16";
 
-  AndIntLit16(int high, BytecodeStream stream) {
+  DexAndIntLit16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AndIntLit16(int dest, int left, int constant) {
+  public DexAndIntLit16(int dest, int left, int constant) {
     super(dest, left, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AndIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexAndIntLit8.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/AndIntLit8.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAndIntLit8.java
index a347b70..18778c6 100644
--- a/src/main/java/com/android/tools/r8/code/AndIntLit8.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAndIntLit8.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class AndIntLit8 extends Format22b {
+
+public class DexAndIntLit8 extends DexFormat22b {
 
   public static final int OPCODE = 0xdd;
   public static final String NAME = "AndIntLit8";
   public static final String SMALI_NAME = "and-int/lit8";
 
-  AndIntLit8(int high, BytecodeStream stream) {
+  DexAndIntLit8(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AndIntLit8(int dest, int left, int constant) {
+  public DexAndIntLit8(int dest, int left, int constant) {
     super(dest, left, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AndLong.java b/src/main/java/com/android/tools/r8/dex/code/DexAndLong.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AndLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAndLong.java
index 0bc3eaa..5458217 100644
--- a/src/main/java/com/android/tools/r8/code/AndLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAndLong.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AndLong extends Format23x {
+public class DexAndLong extends DexFormat23x {
 
   public static final int OPCODE = 0xA0;
   public static final String NAME = "AndLong";
   public static final String SMALI_NAME = "and-long";
 
-  AndLong(int high, BytecodeStream stream) {
+  DexAndLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AndLong(int dest, int left, int right) {
+  public DexAndLong(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AndLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexAndLong2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AndLong2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAndLong2Addr.java
index 276a814..73babe5 100644
--- a/src/main/java/com/android/tools/r8/code/AndLong2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAndLong2Addr.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class AndLong2Addr extends Format12x {
+
+public class DexAndLong2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xc0;
   public static final String NAME = "AndLong2Addr";
   public static final String SMALI_NAME = "and-long/2addr";
 
-  AndLong2Addr(int high, BytecodeStream stream) {
+  DexAndLong2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AndLong2Addr(int left, int right) {
+  public DexAndLong2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/Aput.java b/src/main/java/com/android/tools/r8/dex/code/DexAput.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/Aput.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAput.java
index 65e0721..c5b1e1a 100644
--- a/src/main/java/com/android/tools/r8/code/Aput.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAput.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class Aput extends Format23x {
+public class DexAput extends DexFormat23x {
 
   public static final int OPCODE = 0x4b;
   public static final String NAME = "Aput";
   public static final String SMALI_NAME = "aput";
 
-  /*package*/ Aput(int high, BytecodeStream stream) {
+  /*package*/ DexAput(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public Aput(int AA, int BB, int CC) {
+  public DexAput(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AputBoolean.java b/src/main/java/com/android/tools/r8/dex/code/DexAputBoolean.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AputBoolean.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAputBoolean.java
index ac64012..78d70a2 100644
--- a/src/main/java/com/android/tools/r8/code/AputBoolean.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAputBoolean.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AputBoolean extends Format23x {
+public class DexAputBoolean extends DexFormat23x {
 
   public static final int OPCODE = 0x4e;
   public static final String NAME = "AputBoolean";
   public static final String SMALI_NAME = "aput-boolean";
 
-  /*package*/ AputBoolean(int high, BytecodeStream stream) {
+  /*package*/ DexAputBoolean(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AputBoolean(int AA, int BB, int CC) {
+  public DexAputBoolean(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AputByte.java b/src/main/java/com/android/tools/r8/dex/code/DexAputByte.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/AputByte.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAputByte.java
index 1d439c6..04def29 100644
--- a/src/main/java/com/android/tools/r8/code/AputByte.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAputByte.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AputByte extends Format23x {
+public class DexAputByte extends DexFormat23x {
 
   public static final int OPCODE = 0x4f;
   public static final String NAME = "AputByte";
   public static final String SMALI_NAME = "aput-byte";
 
-  /*package*/ AputByte(int high, BytecodeStream stream) {
+  /*package*/ DexAputByte(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AputByte(int AA, int BB, int CC) {
+  public DexAputByte(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AputChar.java b/src/main/java/com/android/tools/r8/dex/code/DexAputChar.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AputChar.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAputChar.java
index 14e408c..0f66bfa 100644
--- a/src/main/java/com/android/tools/r8/code/AputChar.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAputChar.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AputChar extends Format23x {
+public class DexAputChar extends DexFormat23x {
 
   public static final int OPCODE = 0x50;
   public static final String NAME = "AputChar";
   public static final String SMALI_NAME = "aput-char";
 
-  /*package*/ AputChar(int high, BytecodeStream stream) {
+  /*package*/ DexAputChar(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AputChar(int AA, int BB, int CC) {
+  public DexAputChar(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AputObject.java b/src/main/java/com/android/tools/r8/dex/code/DexAputObject.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AputObject.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAputObject.java
index bcfea78..3012172 100644
--- a/src/main/java/com/android/tools/r8/code/AputObject.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAputObject.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AputObject extends Format23x {
+public class DexAputObject extends DexFormat23x {
 
   public static final int OPCODE = 0x4d;
   public static final String NAME = "AputObject";
   public static final String SMALI_NAME = "aput-object";
 
-  /*package*/ AputObject(int high, BytecodeStream stream) {
+  /*package*/ DexAputObject(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AputObject(int AA, int BB, int CC) {
+  public DexAputObject(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AputShort.java b/src/main/java/com/android/tools/r8/dex/code/DexAputShort.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/AputShort.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAputShort.java
index daf9b4a..6a3173e 100644
--- a/src/main/java/com/android/tools/r8/code/AputShort.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAputShort.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AputShort extends Format23x {
+public class DexAputShort extends DexFormat23x {
 
   public static final int OPCODE = 0x51;
   public static final String NAME = "AputShort";
   public static final String SMALI_NAME = "aput-short";
 
-  /*package*/ AputShort(int high, BytecodeStream stream) {
+  /*package*/ DexAputShort(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AputShort(int AA, int BB, int CC) {
+  public DexAputShort(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/AputWide.java b/src/main/java/com/android/tools/r8/dex/code/DexAputWide.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/AputWide.java
rename to src/main/java/com/android/tools/r8/dex/code/DexAputWide.java
index 286dfff..adf0e40 100644
--- a/src/main/java/com/android/tools/r8/code/AputWide.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexAputWide.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.MemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class AputWide extends Format23x {
+public class DexAputWide extends DexFormat23x {
 
   public static final int OPCODE = 0x4c;
   public static final String NAME = "AputWide";
   public static final String SMALI_NAME = "aput-wide";
 
-  /*package*/ AputWide(int high, BytecodeStream stream) {
+  /*package*/ DexAputWide(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public AputWide(int AA, int BB, int CC) {
+  public DexAputWide(int AA, int BB, int CC) {
     super(AA, BB, CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ArrayLength.java b/src/main/java/com/android/tools/r8/dex/code/DexArrayLength.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/ArrayLength.java
rename to src/main/java/com/android/tools/r8/dex/code/DexArrayLength.java
index 156df49..543ab01 100644
--- a/src/main/java/com/android/tools/r8/code/ArrayLength.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexArrayLength.java
@@ -1,21 +1,21 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class ArrayLength extends Format12x {
+public class DexArrayLength extends DexFormat12x {
 
   public static final int OPCODE = 0x21;
   public static final String NAME = "ArrayLength";
   public static final String SMALI_NAME = "array-length";
 
-  ArrayLength(int high, BytecodeStream stream) {
+  DexArrayLength(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ArrayLength(int dest, int array) {
+  public DexArrayLength(int dest, int array) {
     super(dest, array);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/Base1Format.java b/src/main/java/com/android/tools/r8/dex/code/DexBase1Format.java
similarity index 64%
rename from src/main/java/com/android/tools/r8/code/Base1Format.java
rename to src/main/java/com/android/tools/r8/dex/code/DexBase1Format.java
index 09c4bc8..eaea826 100644
--- a/src/main/java/com/android/tools/r8/code/Base1Format.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexBase1Format.java
@@ -1,17 +1,17 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
-public abstract class Base1Format extends Instruction {
+public abstract class DexBase1Format extends DexInstruction {
 
   public static final int SIZE = 1;
 
-  public Base1Format(BytecodeStream stream) {
+  public DexBase1Format(BytecodeStream stream) {
     super(stream);
   }
 
-  protected Base1Format() {}
+  protected DexBase1Format() {}
 
   @Override
   public int getSize() {
diff --git a/src/main/java/com/android/tools/r8/code/Base2Format.java b/src/main/java/com/android/tools/r8/dex/code/DexBase2Format.java
similarity index 64%
rename from src/main/java/com/android/tools/r8/code/Base2Format.java
rename to src/main/java/com/android/tools/r8/dex/code/DexBase2Format.java
index 7d8e51e..abc2ee2 100644
--- a/src/main/java/com/android/tools/r8/code/Base2Format.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexBase2Format.java
@@ -1,15 +1,15 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
-public abstract class Base2Format extends Instruction {
+public abstract class DexBase2Format extends DexInstruction {
 
   public static final int SIZE = 2;
 
-  protected Base2Format() {}
+  protected DexBase2Format() {}
 
-  public Base2Format(BytecodeStream stream) {
+  public DexBase2Format(BytecodeStream stream) {
     super(stream);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/Base3Format.java b/src/main/java/com/android/tools/r8/dex/code/DexBase3Format.java
similarity index 64%
rename from src/main/java/com/android/tools/r8/code/Base3Format.java
rename to src/main/java/com/android/tools/r8/dex/code/DexBase3Format.java
index 62d6824..e78d48d 100644
--- a/src/main/java/com/android/tools/r8/code/Base3Format.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexBase3Format.java
@@ -1,15 +1,15 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
-public abstract class Base3Format extends Instruction {
+public abstract class DexBase3Format extends DexInstruction {
 
   public static final int SIZE = 3;
 
-  protected Base3Format() {}
+  protected DexBase3Format() {}
 
-  public Base3Format(BytecodeStream stream) {
+  public DexBase3Format(BytecodeStream stream) {
     super(stream);
   }
 
@@ -17,4 +17,4 @@
   public int getSize() {
     return SIZE;
   }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/android/tools/r8/code/Base4Format.java b/src/main/java/com/android/tools/r8/dex/code/DexBase4Format.java
similarity index 64%
rename from src/main/java/com/android/tools/r8/code/Base4Format.java
rename to src/main/java/com/android/tools/r8/dex/code/DexBase4Format.java
index a08411f..ea206fe 100644
--- a/src/main/java/com/android/tools/r8/code/Base4Format.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexBase4Format.java
@@ -1,15 +1,15 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
-public abstract class Base4Format extends Instruction {
+public abstract class DexBase4Format extends DexInstruction {
 
   public static final int SIZE = 4;
 
-  protected Base4Format() {}
+  protected DexBase4Format() {}
 
-  public Base4Format(BytecodeStream stream) {
+  public DexBase4Format(BytecodeStream stream) {
     super(stream);
   }
 
@@ -17,4 +17,4 @@
   public int getSize() {
     return SIZE;
   }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/android/tools/r8/code/Base5Format.java b/src/main/java/com/android/tools/r8/dex/code/DexBase5Format.java
similarity index 64%
rename from src/main/java/com/android/tools/r8/code/Base5Format.java
rename to src/main/java/com/android/tools/r8/dex/code/DexBase5Format.java
index 093e932..207129d 100644
--- a/src/main/java/com/android/tools/r8/code/Base5Format.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexBase5Format.java
@@ -1,15 +1,15 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
-public abstract class Base5Format extends Instruction {
+public abstract class DexBase5Format extends DexInstruction {
 
   public static final int SIZE = 5;
 
-  protected Base5Format() {}
+  protected DexBase5Format() {}
 
-  public Base5Format(BytecodeStream stream) {
+  public DexBase5Format(BytecodeStream stream) {
     super(stream);
   }
 
@@ -17,4 +17,4 @@
   public int getSize() {
     return SIZE;
   }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexBaseInstructionFactory.java b/src/main/java/com/android/tools/r8/dex/code/DexBaseInstructionFactory.java
new file mode 100644
index 0000000..fdd4b40
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/dex/code/DexBaseInstructionFactory.java
@@ -0,0 +1,465 @@
+// 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.dex.code;
+
+import com.android.tools.r8.graph.OffsetToObjectMapping;
+
+abstract class DexBaseInstructionFactory {
+
+  static DexInstruction create(
+      int high, int opcode, BytecodeStream stream, OffsetToObjectMapping mapping) {
+    switch (opcode) {
+      case 0x0:
+        return DexNop.create(high, stream);
+      case DexMove.OPCODE:
+        return new DexMove(high, stream);
+      case DexMoveFrom16.OPCODE:
+        return new DexMoveFrom16(high, stream);
+      case DexMove16.OPCODE:
+        return new DexMove16(high, stream);
+      case DexMoveWide.OPCODE:
+        return new DexMoveWide(high, stream);
+      case DexMoveWideFrom16.OPCODE:
+        return new DexMoveWideFrom16(high, stream);
+      case DexMoveWide16.OPCODE:
+        return new DexMoveWide16(high, stream);
+      case DexMoveObject.OPCODE:
+        return new DexMoveObject(high, stream);
+      case DexMoveObjectFrom16.OPCODE:
+        return new DexMoveObjectFrom16(high, stream);
+      case DexMoveObject16.OPCODE:
+        return new DexMoveObject16(high, stream);
+      case DexMoveResult.OPCODE:
+        return new DexMoveResult(high, stream);
+      case DexMoveResultWide.OPCODE:
+        return new DexMoveResultWide(high, stream);
+      case DexMoveResultObject.OPCODE:
+        return new DexMoveResultObject(high, stream);
+      case DexMoveException.OPCODE:
+        return new DexMoveException(high, stream);
+      case DexReturnVoid.OPCODE:
+        return new DexReturnVoid(high, stream);
+      case DexReturn.OPCODE:
+        return new DexReturn(high, stream);
+      case DexReturnWide.OPCODE:
+        return new DexReturnWide(high, stream);
+      case DexReturnObject.OPCODE:
+        return new DexReturnObject(high, stream);
+      case DexConst4.OPCODE:
+        return new DexConst4(high, stream);
+      case DexConst16.OPCODE:
+        return new DexConst16(high, stream);
+      case DexConst.OPCODE:
+        return new DexConst(high, stream);
+      case DexConstHigh16.OPCODE:
+        return new DexConstHigh16(high, stream);
+      case DexConstWide16.OPCODE:
+        return new DexConstWide16(high, stream);
+      case DexConstWide32.OPCODE:
+        return new DexConstWide32(high, stream);
+      case DexConstWide.OPCODE:
+        return new DexConstWide(high, stream);
+      case DexConstWideHigh16.OPCODE:
+        return new DexConstWideHigh16(high, stream);
+      case DexConstString.OPCODE:
+        return new DexConstString(high, stream, mapping);
+      case DexConstStringJumbo.OPCODE:
+        return new DexConstStringJumbo(high, stream, mapping);
+      case DexConstClass.OPCODE:
+        return new DexConstClass(high, stream, mapping);
+      case DexMonitorEnter.OPCODE:
+        return new DexMonitorEnter(high, stream);
+      case DexMonitorExit.OPCODE:
+        return new DexMonitorExit(high, stream);
+      case DexCheckCast.OPCODE:
+        return new DexCheckCast(high, stream, mapping);
+      case DexInstanceOf.OPCODE:
+        return new DexInstanceOf(high, stream, mapping);
+      case DexArrayLength.OPCODE:
+        return new DexArrayLength(high, stream);
+      case DexNewInstance.OPCODE:
+        return new DexNewInstance(high, stream, mapping);
+      case DexNewArray.OPCODE:
+        return new DexNewArray(high, stream, mapping);
+      case DexFilledNewArray.OPCODE:
+        return new DexFilledNewArray(high, stream, mapping);
+      case DexFilledNewArrayRange.OPCODE:
+        return new DexFilledNewArrayRange(high, stream, mapping);
+      case DexFillArrayData.OPCODE:
+        return new DexFillArrayData(high, stream);
+      case DexThrow.OPCODE:
+        return new DexThrow(high, stream);
+      case DexGoto.OPCODE:
+        return new DexGoto(high, stream);
+      case DexGoto16.OPCODE:
+        return new DexGoto16(high, stream);
+      case DexGoto32.OPCODE:
+        return new DexGoto32(high, stream);
+      case DexPackedSwitch.OPCODE:
+        return new DexPackedSwitch(high, stream);
+      case DexSparseSwitch.OPCODE:
+        return new DexSparseSwitch(high, stream);
+      case DexCmplFloat.OPCODE:
+        return new DexCmplFloat(high, stream);
+      case DexCmpgFloat.OPCODE:
+        return new DexCmpgFloat(high, stream);
+      case DexCmplDouble.OPCODE:
+        return new DexCmplDouble(high, stream);
+      case DexCmpgDouble.OPCODE:
+        return new DexCmpgDouble(high, stream);
+      case DexCmpLong.OPCODE:
+        return new DexCmpLong(high, stream);
+      case DexIfEq.OPCODE:
+        return new DexIfEq(high, stream);
+      case DexIfNe.OPCODE:
+        return new DexIfNe(high, stream);
+      case DexIfLt.OPCODE:
+        return new DexIfLt(high, stream);
+      case DexIfGe.OPCODE:
+        return new DexIfGe(high, stream);
+      case DexIfGt.OPCODE:
+        return new DexIfGt(high, stream);
+      case DexIfLe.OPCODE:
+        return new DexIfLe(high, stream);
+      case DexIfEqz.OPCODE:
+        return new DexIfEqz(high, stream);
+      case DexIfNez.OPCODE:
+        return new DexIfNez(high, stream);
+      case DexIfLtz.OPCODE:
+        return new DexIfLtz(high, stream);
+      case DexIfGez.OPCODE:
+        return new DexIfGez(high, stream);
+      case DexIfGtz.OPCODE:
+        return new DexIfGtz(high, stream);
+      case DexIfLez.OPCODE:
+        return new DexIfLez(high, stream);
+      case DexAget.OPCODE:
+        return new DexAget(high, stream);
+      case DexAgetWide.OPCODE:
+        return new DexAgetWide(high, stream);
+      case DexAgetObject.OPCODE:
+        return new DexAgetObject(high, stream);
+      case DexAgetBoolean.OPCODE:
+        return new DexAgetBoolean(high, stream);
+      case DexAgetByte.OPCODE:
+        return new DexAgetByte(high, stream);
+      case DexAgetChar.OPCODE:
+        return new DexAgetChar(high, stream);
+      case DexAgetShort.OPCODE:
+        return new DexAgetShort(high, stream);
+      case DexAput.OPCODE:
+        return new DexAput(high, stream);
+      case DexAputWide.OPCODE:
+        return new DexAputWide(high, stream);
+      case DexAputObject.OPCODE:
+        return new DexAputObject(high, stream);
+      case DexAputBoolean.OPCODE:
+        return new DexAputBoolean(high, stream);
+      case DexAputByte.OPCODE:
+        return new DexAputByte(high, stream);
+      case DexAputChar.OPCODE:
+        return new DexAputChar(high, stream);
+      case DexAputShort.OPCODE:
+        return new DexAputShort(high, stream);
+      case DexIget.OPCODE:
+        return new DexIget(high, stream, mapping);
+      case DexIgetWide.OPCODE:
+        return new DexIgetWide(high, stream, mapping);
+      case DexIgetObject.OPCODE:
+        return new DexIgetObject(high, stream, mapping);
+      case DexIgetBoolean.OPCODE:
+        return new DexIgetBoolean(high, stream, mapping);
+      case DexIgetByte.OPCODE:
+        return new DexIgetByte(high, stream, mapping);
+      case DexIgetChar.OPCODE:
+        return new DexIgetChar(high, stream, mapping);
+      case DexIgetShort.OPCODE:
+        return new DexIgetShort(high, stream, mapping);
+      case DexIput.OPCODE:
+        return new DexIput(high, stream, mapping);
+      case DexIputWide.OPCODE:
+        return new DexIputWide(high, stream, mapping);
+      case DexIputObject.OPCODE:
+        return new DexIputObject(high, stream, mapping);
+      case DexIputBoolean.OPCODE:
+        return new DexIputBoolean(high, stream, mapping);
+      case DexIputByte.OPCODE:
+        return new DexIputByte(high, stream, mapping);
+      case DexIputChar.OPCODE:
+        return new DexIputChar(high, stream, mapping);
+      case DexIputShort.OPCODE:
+        return new DexIputShort(high, stream, mapping);
+      case DexSget.OPCODE:
+        return new DexSget(high, stream, mapping);
+      case DexSgetWide.OPCODE:
+        return new DexSgetWide(high, stream, mapping);
+      case DexSgetObject.OPCODE:
+        return new DexSgetObject(high, stream, mapping);
+      case DexSgetBoolean.OPCODE:
+        return new DexSgetBoolean(high, stream, mapping);
+      case DexSgetByte.OPCODE:
+        return new DexSgetByte(high, stream, mapping);
+      case DexSgetChar.OPCODE:
+        return new DexSgetChar(high, stream, mapping);
+      case DexSgetShort.OPCODE:
+        return new DexSgetShort(high, stream, mapping);
+      case DexSput.OPCODE:
+        return new DexSput(high, stream, mapping);
+      case DexSputWide.OPCODE:
+        return new DexSputWide(high, stream, mapping);
+      case DexSputObject.OPCODE:
+        return new DexSputObject(high, stream, mapping);
+      case DexSputBoolean.OPCODE:
+        return new DexSputBoolean(high, stream, mapping);
+      case DexSputByte.OPCODE:
+        return new DexSputByte(high, stream, mapping);
+      case DexSputChar.OPCODE:
+        return new DexSputChar(high, stream, mapping);
+      case DexSputShort.OPCODE:
+        return new DexSputShort(high, stream, mapping);
+      case DexInvokeVirtual.OPCODE:
+        return new DexInvokeVirtual(high, stream, mapping);
+      case DexInvokeSuper.OPCODE:
+        return new DexInvokeSuper(high, stream, mapping);
+      case DexInvokeDirect.OPCODE:
+        return new DexInvokeDirect(high, stream, mapping);
+      case DexInvokeStatic.OPCODE:
+        return new DexInvokeStatic(high, stream, mapping);
+      case DexInvokeInterface.OPCODE:
+        return new DexInvokeInterface(high, stream, mapping);
+      case DexInvokeVirtualRange.OPCODE:
+        return new DexInvokeVirtualRange(high, stream, mapping);
+      case DexInvokeSuperRange.OPCODE:
+        return new DexInvokeSuperRange(high, stream, mapping);
+      case DexInvokeDirectRange.OPCODE:
+        return new DexInvokeDirectRange(high, stream, mapping);
+      case DexInvokeStaticRange.OPCODE:
+        return new DexInvokeStaticRange(high, stream, mapping);
+      case DexInvokeInterfaceRange.OPCODE:
+        return new DexInvokeInterfaceRange(high, stream, mapping);
+      case DexNegInt.OPCODE:
+        return new DexNegInt(high, stream);
+      case DexNotInt.OPCODE:
+        return new DexNotInt(high, stream);
+      case DexNegLong.OPCODE:
+        return new DexNegLong(high, stream);
+      case DexNotLong.OPCODE:
+        return new DexNotLong(high, stream);
+      case DexNegFloat.OPCODE:
+        return new DexNegFloat(high, stream);
+      case DexNegDouble.OPCODE:
+        return new DexNegDouble(high, stream);
+      case DexIntToLong.OPCODE:
+        return new DexIntToLong(high, stream);
+      case DexIntToFloat.OPCODE:
+        return new DexIntToFloat(high, stream);
+      case DexIntToDouble.OPCODE:
+        return new DexIntToDouble(high, stream);
+      case DexLongToInt.OPCODE:
+        return new DexLongToInt(high, stream);
+      case DexLongToFloat.OPCODE:
+        return new DexLongToFloat(high, stream);
+      case DexLongToDouble.OPCODE:
+        return new DexLongToDouble(high, stream);
+      case DexFloatToInt.OPCODE:
+        return new DexFloatToInt(high, stream);
+      case DexFloatToLong.OPCODE:
+        return new DexFloatToLong(high, stream);
+      case DexFloatToDouble.OPCODE:
+        return new DexFloatToDouble(high, stream);
+      case DexDoubleToInt.OPCODE:
+        return new DexDoubleToInt(high, stream);
+      case DexDoubleToLong.OPCODE:
+        return new DexDoubleToLong(high, stream);
+      case DexDoubleToFloat.OPCODE:
+        return new DexDoubleToFloat(high, stream);
+      case DexIntToByte.OPCODE:
+        return new DexIntToByte(high, stream);
+      case DexIntToChar.OPCODE:
+        return new DexIntToChar(high, stream);
+      case DexIntToShort.OPCODE:
+        return new DexIntToShort(high, stream);
+      case DexAddInt.OPCODE:
+        return new DexAddInt(high, stream);
+      case DexSubInt.OPCODE:
+        return new DexSubInt(high, stream);
+      case DexMulInt.OPCODE:
+        return new DexMulInt(high, stream);
+      case DexDivInt.OPCODE:
+        return new DexDivInt(high, stream);
+      case DexRemInt.OPCODE:
+        return new DexRemInt(high, stream);
+      case DexAndInt.OPCODE:
+        return new DexAndInt(high, stream);
+      case DexOrInt.OPCODE:
+        return new DexOrInt(high, stream);
+      case DexXorInt.OPCODE:
+        return new DexXorInt(high, stream);
+      case DexShlInt.OPCODE:
+        return new DexShlInt(high, stream);
+      case DexShrInt.OPCODE:
+        return new DexShrInt(high, stream);
+      case DexUshrInt.OPCODE:
+        return new DexUshrInt(high, stream);
+      case DexAddLong.OPCODE:
+        return new DexAddLong(high, stream);
+      case DexSubLong.OPCODE:
+        return new DexSubLong(high, stream);
+      case DexMulLong.OPCODE:
+        return new DexMulLong(high, stream);
+      case DexDivLong.OPCODE:
+        return new DexDivLong(high, stream);
+      case DexRemLong.OPCODE:
+        return new DexRemLong(high, stream);
+      case DexAndLong.OPCODE:
+        return new DexAndLong(high, stream);
+      case DexOrLong.OPCODE:
+        return new DexOrLong(high, stream);
+      case DexXorLong.OPCODE:
+        return new DexXorLong(high, stream);
+      case DexShlLong.OPCODE:
+        return new DexShlLong(high, stream);
+      case DexShrLong.OPCODE:
+        return new DexShrLong(high, stream);
+      case DexUshrLong.OPCODE:
+        return new DexUshrLong(high, stream);
+      case DexAddFloat.OPCODE:
+        return new DexAddFloat(high, stream);
+      case DexSubFloat.OPCODE:
+        return new DexSubFloat(high, stream);
+      case DexMulFloat.OPCODE:
+        return new DexMulFloat(high, stream);
+      case DexDivFloat.OPCODE:
+        return new DexDivFloat(high, stream);
+      case DexRemFloat.OPCODE:
+        return new DexRemFloat(high, stream);
+      case DexAddDouble.OPCODE:
+        return new DexAddDouble(high, stream);
+      case DexSubDouble.OPCODE:
+        return new DexSubDouble(high, stream);
+      case DexMulDouble.OPCODE:
+        return new DexMulDouble(high, stream);
+      case DexDivDouble.OPCODE:
+        return new DexDivDouble(high, stream);
+      case DexRemDouble.OPCODE:
+        return new DexRemDouble(high, stream);
+      case DexAddInt2Addr.OPCODE:
+        return new DexAddInt2Addr(high, stream);
+      case DexSubInt2Addr.OPCODE:
+        return new DexSubInt2Addr(high, stream);
+      case DexMulInt2Addr.OPCODE:
+        return new DexMulInt2Addr(high, stream);
+      case DexDivInt2Addr.OPCODE:
+        return new DexDivInt2Addr(high, stream);
+      case DexRemInt2Addr.OPCODE:
+        return new DexRemInt2Addr(high, stream);
+      case DexAndInt2Addr.OPCODE:
+        return new DexAndInt2Addr(high, stream);
+      case DexOrInt2Addr.OPCODE:
+        return new DexOrInt2Addr(high, stream);
+      case DexXorInt2Addr.OPCODE:
+        return new DexXorInt2Addr(high, stream);
+      case DexShlInt2Addr.OPCODE:
+        return new DexShlInt2Addr(high, stream);
+      case DexShrInt2Addr.OPCODE:
+        return new DexShrInt2Addr(high, stream);
+      case DexUshrInt2Addr.OPCODE:
+        return new DexUshrInt2Addr(high, stream);
+      case DexAddLong2Addr.OPCODE:
+        return new DexAddLong2Addr(high, stream);
+      case DexSubLong2Addr.OPCODE:
+        return new DexSubLong2Addr(high, stream);
+      case DexMulLong2Addr.OPCODE:
+        return new DexMulLong2Addr(high, stream);
+      case DexDivLong2Addr.OPCODE:
+        return new DexDivLong2Addr(high, stream);
+      case DexRemLong2Addr.OPCODE:
+        return new DexRemLong2Addr(high, stream);
+      case DexAndLong2Addr.OPCODE:
+        return new DexAndLong2Addr(high, stream);
+      case DexOrLong2Addr.OPCODE:
+        return new DexOrLong2Addr(high, stream);
+      case DexXorLong2Addr.OPCODE:
+        return new DexXorLong2Addr(high, stream);
+      case DexShlLong2Addr.OPCODE:
+        return new DexShlLong2Addr(high, stream);
+      case DexShrLong2Addr.OPCODE:
+        return new DexShrLong2Addr(high, stream);
+      case DexUshrLong2Addr.OPCODE:
+        return new DexUshrLong2Addr(high, stream);
+      case DexAddFloat2Addr.OPCODE:
+        return new DexAddFloat2Addr(high, stream);
+      case DexSubFloat2Addr.OPCODE:
+        return new DexSubFloat2Addr(high, stream);
+      case DexMulFloat2Addr.OPCODE:
+        return new DexMulFloat2Addr(high, stream);
+      case DexDivFloat2Addr.OPCODE:
+        return new DexDivFloat2Addr(high, stream);
+      case DexRemFloat2Addr.OPCODE:
+        return new DexRemFloat2Addr(high, stream);
+      case DexAddDouble2Addr.OPCODE:
+        return new DexAddDouble2Addr(high, stream);
+      case DexSubDouble2Addr.OPCODE:
+        return new DexSubDouble2Addr(high, stream);
+      case DexMulDouble2Addr.OPCODE:
+        return new DexMulDouble2Addr(high, stream);
+      case DexDivDouble2Addr.OPCODE:
+        return new DexDivDouble2Addr(high, stream);
+      case DexRemDouble2Addr.OPCODE:
+        return new DexRemDouble2Addr(high, stream);
+      case DexAddIntLit16.OPCODE:
+        return new DexAddIntLit16(high, stream);
+      case DexRsubInt.OPCODE:
+        return new DexRsubInt(high, stream);
+      case DexMulIntLit16.OPCODE:
+        return new DexMulIntLit16(high, stream);
+      case DexDivIntLit16.OPCODE:
+        return new DexDivIntLit16(high, stream);
+      case DexRemIntLit16.OPCODE:
+        return new DexRemIntLit16(high, stream);
+      case DexAndIntLit16.OPCODE:
+        return new DexAndIntLit16(high, stream);
+      case DexOrIntLit16.OPCODE:
+        return new DexOrIntLit16(high, stream);
+      case DexXorIntLit16.OPCODE:
+        return new DexXorIntLit16(high, stream);
+      case DexAddIntLit8.OPCODE:
+        return new DexAddIntLit8(high, stream);
+      case DexRsubIntLit8.OPCODE:
+        return new DexRsubIntLit8(high, stream);
+      case DexMulIntLit8.OPCODE:
+        return new DexMulIntLit8(high, stream);
+      case DexDivIntLit8.OPCODE:
+        return new DexDivIntLit8(high, stream);
+      case DexRemIntLit8.OPCODE:
+        return new DexRemIntLit8(high, stream);
+      case DexAndIntLit8.OPCODE:
+        return new DexAndIntLit8(high, stream);
+      case DexOrIntLit8.OPCODE:
+        return new DexOrIntLit8(high, stream);
+      case DexXorIntLit8.OPCODE:
+        return new DexXorIntLit8(high, stream);
+      case DexShlIntLit8.OPCODE:
+        return new DexShlIntLit8(high, stream);
+      case DexShrIntLit8.OPCODE:
+        return new DexShrIntLit8(high, stream);
+      case DexUshrIntLit8.OPCODE:
+        return new DexUshrIntLit8(high, stream);
+      case DexInvokePolymorphic.OPCODE:
+        return new DexInvokePolymorphic(high, stream, mapping);
+      case DexInvokePolymorphicRange.OPCODE:
+        return new DexInvokePolymorphicRange(high, stream, mapping);
+      case DexInvokeCustom.OPCODE:
+        return new DexInvokeCustom(high, stream, mapping);
+      case DexInvokeCustomRange.OPCODE:
+        return new DexInvokeCustomRange(high, stream, mapping);
+      case DexConstMethodHandle.OPCODE:
+        return new DexConstMethodHandle(high, stream, mapping);
+      case DexConstMethodType.OPCODE:
+        return new DexConstMethodType(high, stream, mapping);
+      default:
+        throw new IllegalArgumentException("Illegal Opcode: 0x" + Integer.toString(opcode, 16));
+    }
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/code/CheckCast.java b/src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/code/CheckCast.java
rename to src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java
index 74a5f91..06f7a38 100644
--- a/src/main/java/com/android/tools/r8/code/CheckCast.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.DexType;
@@ -15,7 +15,7 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-public class CheckCast extends Format21c<DexType> {
+public class DexCheckCast extends DexFormat21c<DexType> {
 
   public static final int OPCODE = 0x1f;
   public static final String NAME = "CheckCast";
@@ -23,12 +23,12 @@
 
   private final boolean ignoreCompatRules;
 
-  CheckCast(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexCheckCast(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getTypeMap());
     this.ignoreCompatRules = false;
   }
 
-  public CheckCast(int valueRegister, DexType type, boolean ignoreCompatRules) {
+  public DexCheckCast(int valueRegister, DexType type, boolean ignoreCompatRules) {
     super(valueRegister, type);
     this.ignoreCompatRules = ignoreCompatRules;
   }
@@ -49,7 +49,7 @@
   }
 
   @Override
-  void internalSubSpecify(StructuralSpecification<Format21c<DexType>, ?> spec) {
+  void internalSubSpecify(StructuralSpecification<DexFormat21c<DexType>, ?> spec) {
     spec.withItem(i -> i.BBBB);
   }
 
@@ -81,7 +81,7 @@
   }
 
   @Override
-  public CheckCast asCheckCast() {
+  public DexCheckCast asCheckCast() {
     return this;
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/CmpLong.java b/src/main/java/com/android/tools/r8/dex/code/DexCmpLong.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/CmpLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexCmpLong.java
index 38f1bc9..57f1807 100644
--- a/src/main/java/com/android/tools/r8/code/CmpLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexCmpLong.java
@@ -1,23 +1,23 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.Cmp.Bias;
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class CmpLong extends Format23x {
+public class DexCmpLong extends DexFormat23x {
 
   public static final int OPCODE = 0x31;
   public static final String NAME = "CmpLong";
   public static final String SMALI_NAME = "cmp-long";
 
-  CmpLong(int high, BytecodeStream stream) {
+  DexCmpLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public CmpLong(int dest, int left, int right) {
+  public DexCmpLong(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/CmpgDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexCmpgDouble.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/CmpgDouble.java
rename to src/main/java/com/android/tools/r8/dex/code/DexCmpgDouble.java
index f4cfef4..4414ec7 100644
--- a/src/main/java/com/android/tools/r8/code/CmpgDouble.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexCmpgDouble.java
@@ -1,23 +1,23 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.Cmp.Bias;
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class CmpgDouble extends Format23x {
+public class DexCmpgDouble extends DexFormat23x {
 
   public static final int OPCODE = 0x30;
   public static final String NAME = "CmpgDouble";
   public static final String SMALI_NAME = "cmpg-double";
 
-  CmpgDouble(int high, BytecodeStream stream) {
+  DexCmpgDouble(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public CmpgDouble(int dest, int left, int right) {
+  public DexCmpgDouble(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/CmpgFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexCmpgFloat.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/CmpgFloat.java
rename to src/main/java/com/android/tools/r8/dex/code/DexCmpgFloat.java
index 299e2fe..ac387ed 100644
--- a/src/main/java/com/android/tools/r8/code/CmpgFloat.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexCmpgFloat.java
@@ -1,23 +1,23 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.Cmp.Bias;
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class CmpgFloat extends Format23x {
+public class DexCmpgFloat extends DexFormat23x {
 
   public static final int OPCODE = 0x2e;
   public static final String NAME = "CmpgFloat";
   public static final String SMALI_NAME = "cmpg-float";
 
-  CmpgFloat(int high, BytecodeStream stream) {
+  DexCmpgFloat(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public CmpgFloat(int dest, int left, int right) {
+  public DexCmpgFloat(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/CmplDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexCmplDouble.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/CmplDouble.java
rename to src/main/java/com/android/tools/r8/dex/code/DexCmplDouble.java
index a65ef74..b28bf82 100644
--- a/src/main/java/com/android/tools/r8/code/CmplDouble.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexCmplDouble.java
@@ -1,23 +1,23 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.Cmp.Bias;
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class CmplDouble extends Format23x {
+public class DexCmplDouble extends DexFormat23x {
 
   public static final int OPCODE = 0x2f;
   public static final String NAME = "CmplDouble";
   public static final String SMALI_NAME = "cmpl-double";
 
-  CmplDouble(int high, BytecodeStream stream) {
+  DexCmplDouble(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public CmplDouble(int dest, int left, int right) {
+  public DexCmplDouble(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/CmplFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexCmplFloat.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/CmplFloat.java
rename to src/main/java/com/android/tools/r8/dex/code/DexCmplFloat.java
index 892d0de..76becd7 100644
--- a/src/main/java/com/android/tools/r8/code/CmplFloat.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexCmplFloat.java
@@ -1,23 +1,23 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.Cmp.Bias;
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class CmplFloat extends Format23x {
+public class DexCmplFloat extends DexFormat23x {
 
   public static final int OPCODE = 0x2d;
   public static final String NAME = "CmplFloat";
   public static final String SMALI_NAME = "cmpl-float";
 
-  CmplFloat(int high, BytecodeStream stream) {
+  DexCmplFloat(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public CmplFloat(int dest, int left, int right) {
+  public DexCmplFloat(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DexCompareHelper.java b/src/main/java/com/android/tools/r8/dex/code/DexCompareHelper.java
similarity index 91%
rename from src/main/java/com/android/tools/r8/code/DexCompareHelper.java
rename to src/main/java/com/android/tools/r8/dex/code/DexCompareHelper.java
index 130e69b..93c2501 100644
--- a/src/main/java/com/android/tools/r8/code/DexCompareHelper.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexCompareHelper.java
@@ -1,7 +1,7 @@
 // Copyright (c) 2020, 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.code;
+package com.android.tools.r8.dex.code;
 
 public class DexCompareHelper {
 
@@ -22,7 +22,7 @@
 
   // Helper to signal that the concrete instruction is uniquely determined by its ID/opcode.
   public static int compareIdUniquelyDeterminesEquality(
-      Instruction instruction1, Instruction instruction2) {
+      DexInstruction instruction1, DexInstruction instruction2) {
     assert instruction1.getClass() == instruction2.getClass();
     assert instruction1.getCompareToId() == instruction2.getCompareToId();
     assert instruction1.toString().equals(instruction2.toString());
diff --git a/src/main/java/com/android/tools/r8/code/Const.java b/src/main/java/com/android/tools/r8/dex/code/DexConst.java
similarity index 74%
rename from src/main/java/com/android/tools/r8/code/Const.java
rename to src/main/java/com/android/tools/r8/dex/code/DexConst.java
index 498f747..33fdff4 100644
--- a/src/main/java/com/android/tools/r8/code/Const.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConst.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.SingleConstant;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.StringUtils;
 
-public class Const extends Format31i implements SingleConstant {
+public class DexConst extends DexFormat31i implements SingleConstant {
 
   public static final int OPCODE = 0x14;
   public static final String NAME = "Const";
   public static final String SMALI_NAME = "const";
 
-  Const(int high, BytecodeStream stream) {
+  DexConst(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public Const(int register, int constant) {
+  public DexConst(int register, int constant) {
     super(register, constant);
   }
 
@@ -45,14 +45,14 @@
 
   @Override
   public String toString(ClassNameMapper naming) {
-    return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) +
-        " (" + decodedValue() + ")");
+    return formatString(
+        "v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + " (" + decodedValue() + ")");
   }
 
   @Override
   public String toSmaliString(ClassNameMapper naming) {
-    return formatSmaliString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) +
-        "  # " + decodedValue());
+    return formatSmaliString(
+        "v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + "  # " + decodedValue());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Const16.java b/src/main/java/com/android/tools/r8/dex/code/DexConst16.java
similarity index 78%
rename from src/main/java/com/android/tools/r8/code/Const16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexConst16.java
index 9d69f25..1188df2 100644
--- a/src/main/java/com/android/tools/r8/code/Const16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConst16.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.SingleConstant;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.StringUtils;
 
-public class Const16 extends Format21s implements SingleConstant {
+public class DexConst16 extends DexFormat21s implements SingleConstant {
 
   public static final int OPCODE = 0x13;
   public static final String NAME = "Const16";
   public static final String SMALI_NAME = "const/16";
 
-  /*package*/ Const16(int high, BytecodeStream stream) {
+  /*package*/ DexConst16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public Const16(int dest, int constant) {
+  public DexConst16(int dest, int constant) {
     super(dest, constant);
   }
 
@@ -45,8 +45,8 @@
 
   @Override
   public String toString(ClassNameMapper naming) {
-    return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 4) +
-        " (" + decodedValue() + ")");
+    return formatString(
+        "v" + AA + ", " + StringUtils.hexString(decodedValue(), 4) + " (" + decodedValue() + ")");
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Const4.java b/src/main/java/com/android/tools/r8/dex/code/DexConst4.java
similarity index 74%
rename from src/main/java/com/android/tools/r8/code/Const4.java
rename to src/main/java/com/android/tools/r8/dex/code/DexConst4.java
index b9fd59c..09ecd15 100644
--- a/src/main/java/com/android/tools/r8/code/Const4.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConst4.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.SingleConstant;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.StringUtils;
 
-public class Const4 extends Format11n implements SingleConstant {
+public class DexConst4 extends DexFormat11n implements SingleConstant {
 
   public static final int OPCODE = 0x12;
   public static final String NAME = "Const4";
   public static final String SMALI_NAME = "const/4";
 
-  Const4(int high, BytecodeStream stream) {
+  DexConst4(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public Const4(int dest, int constant) {
+  public DexConst4(int dest, int constant) {
     super(dest, constant);
   }
 
@@ -45,14 +45,14 @@
 
   @Override
   public String toString(ClassNameMapper naming) {
-    return formatString("v" + A + ", " + StringUtils.hexString(decodedValue(), 1) +
-        " (" + decodedValue() + ")");
+    return formatString(
+        "v" + A + ", " + StringUtils.hexString(decodedValue(), 1) + " (" + decodedValue() + ")");
   }
 
   @Override
   public String toSmaliString(ClassNameMapper naming) {
-    return formatSmaliString("v" + A + ", " + StringUtils.hexString(decodedValue(), 2) +
-        "  # " + decodedValue());
+    return formatSmaliString(
+        "v" + A + ", " + StringUtils.hexString(decodedValue(), 2) + "  # " + decodedValue());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/ConstClass.java b/src/main/java/com/android/tools/r8/dex/code/DexConstClass.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/code/ConstClass.java
rename to src/main/java/com/android/tools/r8/dex/code/DexConstClass.java
index 88b35e1..cdff382 100644
--- a/src/main/java/com/android/tools/r8/code/ConstClass.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstClass.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.DexType;
@@ -15,7 +15,7 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-public class ConstClass extends Format21c<DexType> {
+public class DexConstClass extends DexFormat21c<DexType> {
 
   public static final int OPCODE = 0x1c;
   public static final String NAME = "ConstClass";
@@ -23,18 +23,18 @@
 
   private final boolean ignoreCompatRules;
 
-  ConstClass(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexConstClass(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getTypeMap());
     this.ignoreCompatRules = false;
   }
 
-  public ConstClass(int dest, DexType type, boolean ignoreCompatRules) {
+  public DexConstClass(int dest, DexType type, boolean ignoreCompatRules) {
     super(dest, type);
     this.ignoreCompatRules = ignoreCompatRules;
   }
 
   @Override
-  void internalSubSpecify(StructuralSpecification<Format21c<DexType>, ?> spec) {
+  void internalSubSpecify(StructuralSpecification<DexFormat21c<DexType>, ?> spec) {
     spec.withItem(i -> i.BBBB);
   }
 
@@ -100,7 +100,7 @@
   }
 
   @Override
-  public ConstClass asConstClass() {
+  public DexConstClass asConstClass() {
     return this;
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ConstHigh16.java b/src/main/java/com/android/tools/r8/dex/code/DexConstHigh16.java
similarity index 72%
rename from src/main/java/com/android/tools/r8/code/ConstHigh16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexConstHigh16.java
index b16e45d..2e732ed 100644
--- a/src/main/java/com/android/tools/r8/code/ConstHigh16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstHigh16.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.SingleConstant;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.StringUtils;
 
-public class ConstHigh16 extends Format21h implements SingleConstant {
+public class DexConstHigh16 extends DexFormat21h implements SingleConstant {
 
   public static final int OPCODE = 0x15;
   public static final String NAME = "ConstHigh16";
   public static final String SMALI_NAME = "const/high16";
 
-  /*package*/ ConstHigh16(int high, BytecodeStream stream) {
+  /*package*/ DexConstHigh16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ConstHigh16(int register, int constantHighBits) {
+  public DexConstHigh16(int register, int constantHighBits) {
     super(register, constantHighBits);
   }
 
@@ -45,14 +45,14 @@
 
   @Override
   public String toString(ClassNameMapper naming) {
-    return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) +
-        " (" + decodedValue() + ")");
+    return formatString(
+        "v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + " (" + decodedValue() + ")");
   }
 
   @Override
   public String toSmaliString(ClassNameMapper naming) {
-    return formatSmaliString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) +
-        "  # " + decodedValue());
+    return formatSmaliString(
+        "v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + "  # " + decodedValue());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/ConstMethodHandle.java b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java
similarity index 89%
rename from src/main/java/com/android/tools/r8/code/ConstMethodHandle.java
rename to src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java
index 0df963f..c9eceef 100644
--- a/src/main/java/com/android/tools/r8/code/ConstMethodHandle.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.errors.InternalCompilerError;
@@ -18,17 +18,17 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-public class ConstMethodHandle extends Format21c<DexMethodHandle> {
+public class DexConstMethodHandle extends DexFormat21c<DexMethodHandle> {
 
   public static final int OPCODE = 0xfe;
   public static final String NAME = "ConstMethodHandle";
   public static final String SMALI_NAME = "const-method-handle";
 
-  ConstMethodHandle(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexConstMethodHandle(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getMethodHandleMap());
   }
 
-  public ConstMethodHandle(int register, DexMethodHandle methodHandle) {
+  public DexConstMethodHandle(int register, DexMethodHandle methodHandle) {
     super(register, methodHandle);
   }
 
@@ -52,7 +52,7 @@
   }
 
   @Override
-  void internalSubSpecify(StructuralSpecification<Format21c<DexMethodHandle>, ?> spec) {
+  void internalSubSpecify(StructuralSpecification<DexFormat21c<DexMethodHandle>, ?> spec) {
     spec.withItem(i -> i.BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ConstMethodType.java b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java
similarity index 88%
rename from src/main/java/com/android/tools/r8/code/ConstMethodType.java
rename to src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java
index 478d3b5..5f73b75 100644
--- a/src/main/java/com/android/tools/r8/code/ConstMethodType.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.errors.InternalCompilerError;
@@ -17,17 +17,17 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-public class ConstMethodType extends Format21c<DexProto> {
+public class DexConstMethodType extends DexFormat21c<DexProto> {
 
   public static final int OPCODE = 0xff;
   public static final String NAME = "ConstMethodType";
   public static final String SMALI_NAME = "const-method-type";
 
-  ConstMethodType(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexConstMethodType(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getProtosMap());
   }
 
-  public ConstMethodType(int register, DexProto methodType) {
+  public DexConstMethodType(int register, DexProto methodType) {
     super(register, methodType);
   }
 
@@ -51,7 +51,7 @@
   }
 
   @Override
-  void internalSubSpecify(StructuralSpecification<Format21c<DexProto>, ?> spec) {
+  void internalSubSpecify(StructuralSpecification<DexFormat21c<DexProto>, ?> spec) {
     spec.withItem(i -> i.BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ConstString.java b/src/main/java/com/android/tools/r8/dex/code/DexConstString.java
similarity index 87%
rename from src/main/java/com/android/tools/r8/code/ConstString.java
rename to src/main/java/com/android/tools/r8/dex/code/DexConstString.java
index 5fd55e4..04334a8 100644
--- a/src/main/java/com/android/tools/r8/code/ConstString.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstString.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.errors.InternalCompilerError;
@@ -16,17 +16,17 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-public class ConstString extends Format21c<DexString> {
+public class DexConstString extends DexFormat21c<DexString> {
 
   public static final int OPCODE = 0x1a;
   public static final String NAME = "ConstString";
   public static final String SMALI_NAME = "const-string";
 
-  ConstString(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexConstString(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getStringMap());
   }
 
-  public ConstString(int register, DexString string) {
+  public DexConstString(int register, DexString string) {
     super(register, string);
   }
 
@@ -35,7 +35,7 @@
   }
 
   @Override
-  void internalSubSpecify(StructuralSpecification<Format21c<DexString>, ?> spec) {
+  void internalSubSpecify(StructuralSpecification<DexFormat21c<DexString>, ?> spec) {
     spec.withItem(i -> i.BBBB);
   }
 
@@ -64,7 +64,7 @@
   }
 
   @Override
-  public ConstString asConstString() {
+  public DexConstString asConstString() {
     return this;
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ConstStringJumbo.java b/src/main/java/com/android/tools/r8/dex/code/DexConstStringJumbo.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/ConstStringJumbo.java
rename to src/main/java/com/android/tools/r8/dex/code/DexConstStringJumbo.java
index b24f86f..725ef8a 100644
--- a/src/main/java/com/android/tools/r8/code/ConstStringJumbo.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstStringJumbo.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.naming.ClassNameMapper;
 
-public class ConstStringJumbo extends Format31c {
+public class DexConstStringJumbo extends DexFormat31c {
 
   public static final int OPCODE = 0x1b;
   public static final String NAME = "ConstStringJumbo";
   public static final String SMALI_NAME = "const-string/jumbo";
 
-  ConstStringJumbo(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexConstStringJumbo(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getStringMap());
   }
 
-  public ConstStringJumbo(int register, DexString string) {
+  public DexConstStringJumbo(int register, DexString string) {
     super(register, string);
   }
 
@@ -42,7 +42,7 @@
   }
 
   @Override
-  public ConstStringJumbo asConstStringJumbo() {
+  public DexConstStringJumbo asConstStringJumbo() {
     return this;
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ConstWide.java b/src/main/java/com/android/tools/r8/dex/code/DexConstWide.java
similarity index 72%
rename from src/main/java/com/android/tools/r8/code/ConstWide.java
rename to src/main/java/com/android/tools/r8/dex/code/DexConstWide.java
index dd2e6e6..6fbd6f2 100644
--- a/src/main/java/com/android/tools/r8/code/ConstWide.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstWide.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.WideConstant;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.StringUtils;
 
-public class ConstWide extends Format51l implements WideConstant {
+public class DexConstWide extends DexFormat51l implements WideConstant {
 
   public static final int OPCODE = 0x18;
   public static final String NAME = "ConstWide";
   public static final String SMALI_NAME = "const-wide";
 
-  ConstWide(int high, BytecodeStream stream) {
+  DexConstWide(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ConstWide(int dest, long constant) {
+  public DexConstWide(int dest, long constant) {
     super(dest, constant);
   }
 
@@ -45,14 +45,14 @@
 
   @Override
   public String toString(ClassNameMapper naming) {
-    return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) +
-        " (" + decodedValue() + ")");
+    return formatString(
+        "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + " (" + decodedValue() + ")");
   }
 
   @Override
   public String toSmaliString(ClassNameMapper naming) {
-    return formatSmaliString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) +
-        "L  # " + decodedValue());
+    return formatSmaliString(
+        "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + "L  # " + decodedValue());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/ConstWide16.java b/src/main/java/com/android/tools/r8/dex/code/DexConstWide16.java
similarity index 79%
rename from src/main/java/com/android/tools/r8/code/ConstWide16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexConstWide16.java
index 99c1810..e30b886 100644
--- a/src/main/java/com/android/tools/r8/code/ConstWide16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstWide16.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.WideConstant;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.StringUtils;
 
-public class ConstWide16 extends Format21s implements WideConstant {
+public class DexConstWide16 extends DexFormat21s implements WideConstant {
 
   public static final int OPCODE = 0x16;
   public static final String NAME = "ConstWide16";
   public static final String SMALI_NAME = "const-wide/16";
 
-  ConstWide16(int high, BytecodeStream stream) {
+  DexConstWide16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ConstWide16(int dest, int constant) {
+  public DexConstWide16(int dest, int constant) {
     super(dest, constant);
   }
 
@@ -45,8 +45,8 @@
 
   @Override
   public String toString(ClassNameMapper naming) {
-    return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) +
-        " (" + decodedValue() + ")");
+    return formatString(
+        "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + " (" + decodedValue() + ")");
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/ConstWide32.java b/src/main/java/com/android/tools/r8/dex/code/DexConstWide32.java
similarity index 79%
rename from src/main/java/com/android/tools/r8/code/ConstWide32.java
rename to src/main/java/com/android/tools/r8/dex/code/DexConstWide32.java
index 1e2c274..b315cb9 100644
--- a/src/main/java/com/android/tools/r8/code/ConstWide32.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstWide32.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.WideConstant;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.StringUtils;
 
-public class ConstWide32 extends Format31i implements WideConstant {
+public class DexConstWide32 extends DexFormat31i implements WideConstant {
 
   public static final int OPCODE = 0x17;
   public static final String NAME = "ConstWide32";
   public static final String SMALI_NAME = "const-wide/32";
 
-  ConstWide32(int high, BytecodeStream stream) {
+  DexConstWide32(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ConstWide32(int dest, int constant) {
+  public DexConstWide32(int dest, int constant) {
     super(dest, constant);
   }
 
@@ -45,8 +45,8 @@
 
   @Override
   public String toString(ClassNameMapper naming) {
-    return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) +
-        " (" + decodedValue() + ")");
+    return formatString(
+        "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + " (" + decodedValue() + ")");
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/ConstWideHigh16.java b/src/main/java/com/android/tools/r8/dex/code/DexConstWideHigh16.java
similarity index 71%
rename from src/main/java/com/android/tools/r8/code/ConstWideHigh16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexConstWideHigh16.java
index 26d5ea0..0eeca93 100644
--- a/src/main/java/com/android/tools/r8/code/ConstWideHigh16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstWideHigh16.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.WideConstant;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.utils.StringUtils;
 
-public class ConstWideHigh16 extends Format21h implements WideConstant {
+public class DexConstWideHigh16 extends DexFormat21h implements WideConstant {
 
   public static final int OPCODE = 0x19;
   public static final String NAME = "ConstWideHigh16";
   public static final String SMALI_NAME = "const-wide/high16";
 
-  ConstWideHigh16(int high, BytecodeStream stream) {
+  DexConstWideHigh16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ConstWideHigh16(int dest, int constantHighBits) {
+  public DexConstWideHigh16(int dest, int constantHighBits) {
     super(dest, constantHighBits);
   }
 
@@ -45,14 +45,14 @@
 
   @Override
   public String toString(ClassNameMapper naming) {
-    return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) +
-        " (" + decodedValue() + ")");
+    return formatString(
+        "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + " (" + decodedValue() + ")");
   }
 
   @Override
   public String toSmaliString(ClassNameMapper naming) {
-    return formatSmaliString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) +
-        "L  # " + decodedValue());
+    return formatSmaliString(
+        "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + "L  # " + decodedValue());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/DivDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexDivDouble.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/DivDouble.java
rename to src/main/java/com/android/tools/r8/dex/code/DexDivDouble.java
index 1be9ee9..19ad41f 100644
--- a/src/main/java/com/android/tools/r8/code/DivDouble.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexDivDouble.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class DivDouble extends Format23x {
+
+public class DexDivDouble extends DexFormat23x {
 
   public static final int OPCODE = 0xae;
   public static final String NAME = "DivDouble";
   public static final String SMALI_NAME = "div-double";
 
-  DivDouble(int high, BytecodeStream stream) {
+  DexDivDouble(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public DivDouble(int dest, int left, int right) {
+  public DexDivDouble(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DivDouble2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexDivDouble2Addr.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/DivDouble2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexDivDouble2Addr.java
index a8070d2..9481f04 100644
--- a/src/main/java/com/android/tools/r8/code/DivDouble2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexDivDouble2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class DivDouble2Addr extends Format12x {
+public class DexDivDouble2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xce;
   public static final String NAME = "DivDouble2Addr";
   public static final String SMALI_NAME = "div-double/2addr";
 
-  DivDouble2Addr(int high, BytecodeStream stream) {
+  DexDivDouble2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public DivDouble2Addr(int left, int right) {
+  public DexDivDouble2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DivFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexDivFloat.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/DivFloat.java
rename to src/main/java/com/android/tools/r8/dex/code/DexDivFloat.java
index 4069d40..2791142 100644
--- a/src/main/java/com/android/tools/r8/code/DivFloat.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexDivFloat.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class DivFloat extends Format23x {
+
+public class DexDivFloat extends DexFormat23x {
 
   public static final int OPCODE = 0xa9;
   public static final String NAME = "DivFloat";
   public static final String SMALI_NAME = "div-float";
 
-  DivFloat(int high, BytecodeStream stream) {
+  DexDivFloat(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public DivFloat(int dest, int left, int right) {
+  public DexDivFloat(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DivFloat2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexDivFloat2Addr.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/DivFloat2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexDivFloat2Addr.java
index a51af26..56fb846 100644
--- a/src/main/java/com/android/tools/r8/code/DivFloat2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexDivFloat2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class DivFloat2Addr extends Format12x {
+public class DexDivFloat2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xc9;
   public static final String NAME = "DivFloat2Addr";
   public static final String SMALI_NAME = "div-float/2addr";
 
-  DivFloat2Addr(int high, BytecodeStream stream) {
+  DexDivFloat2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public DivFloat2Addr(int left, int right) {
+  public DexDivFloat2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DivInt.java b/src/main/java/com/android/tools/r8/dex/code/DexDivInt.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/DivInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexDivInt.java
index 90e1459..7f5dc8a 100644
--- a/src/main/java/com/android/tools/r8/code/DivInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexDivInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class DivInt extends Format23x {
+public class DexDivInt extends DexFormat23x {
 
   public static final int OPCODE = 0x93;
   public static final String NAME = "DivInt";
   public static final String SMALI_NAME = "div-int";
 
-  /*package*/ DivInt(int high, BytecodeStream stream) {
+  /*package*/ DexDivInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public DivInt(int dest, int left, int right) {
+  public DexDivInt(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DivInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexDivInt2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/DivInt2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexDivInt2Addr.java
index a92d24f..f321ff2 100644
--- a/src/main/java/com/android/tools/r8/code/DivInt2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexDivInt2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class DivInt2Addr extends Format12x {
+public class DexDivInt2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xb3;
   public static final String NAME = "DivInt2Addr";
   public static final String SMALI_NAME = "div-int/2addr";
 
-  /*package*/ DivInt2Addr(int high, BytecodeStream stream) {
+  /*package*/ DexDivInt2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public DivInt2Addr(int left, int right) {
+  public DexDivInt2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DivIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexDivIntLit16.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/DivIntLit16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexDivIntLit16.java
index 1a62f6e..10931d3 100644
--- a/src/main/java/com/android/tools/r8/code/DivIntLit16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexDivIntLit16.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class DivIntLit16 extends Format22s {
+
+public class DexDivIntLit16 extends DexFormat22s {
 
   public static final int OPCODE = 0xd3;
   public static final String NAME = "DivIntLit16";
   public static final String SMALI_NAME = "div-int/lit16";
 
-  /*package*/ DivIntLit16(int high, BytecodeStream stream) {
+  /*package*/ DexDivIntLit16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public DivIntLit16(int dest, int register, int constant) {
+  public DexDivIntLit16(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DivIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexDivIntLit8.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/DivIntLit8.java
rename to src/main/java/com/android/tools/r8/dex/code/DexDivIntLit8.java
index 31fd0e60..0626aa4 100644
--- a/src/main/java/com/android/tools/r8/code/DivIntLit8.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexDivIntLit8.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class DivIntLit8 extends Format22b {
+public class DexDivIntLit8 extends DexFormat22b {
 
   public static final int OPCODE = 0xdb;
   public static final String NAME = "DivIntLit8";
   public static final String SMALI_NAME = "div-int/lit8";
 
-  DivIntLit8(int high, BytecodeStream stream) {
+  DexDivIntLit8(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public DivIntLit8(int dest, int left, int constant) {
+  public DexDivIntLit8(int dest, int left, int constant) {
     super(dest, left, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DivLong.java b/src/main/java/com/android/tools/r8/dex/code/DexDivLong.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/DivLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexDivLong.java
index 271dd04..260be18 100644
--- a/src/main/java/com/android/tools/r8/code/DivLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexDivLong.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class DivLong extends Format23x {
+
+public class DexDivLong extends DexFormat23x {
 
   public static final int OPCODE = 0x9e;
   public static final String NAME = "DivLong";
   public static final String SMALI_NAME = "div-long";
 
-  DivLong(int high, BytecodeStream stream) {
+  DexDivLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public DivLong(int dest, int left, int right) {
+  public DexDivLong(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DivLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexDivLong2Addr.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/DivLong2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexDivLong2Addr.java
index 40f0946..b36326d 100644
--- a/src/main/java/com/android/tools/r8/code/DivLong2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexDivLong2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class DivLong2Addr extends Format12x {
+public class DexDivLong2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xbe;
   public static final String NAME = "DivLong2Addr";
   public static final String SMALI_NAME = "div-long/2addr";
 
-  DivLong2Addr(int high, BytecodeStream stream) {
+  DexDivLong2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public DivLong2Addr(int left, int right) {
+  public DexDivLong2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DoubleToFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexDoubleToFloat.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/DoubleToFloat.java
rename to src/main/java/com/android/tools/r8/dex/code/DexDoubleToFloat.java
index 07b8ab6..008c565 100644
--- a/src/main/java/com/android/tools/r8/code/DoubleToFloat.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexDoubleToFloat.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class DoubleToFloat extends Format12x {
+public class DexDoubleToFloat extends DexFormat12x {
 
   public static final int OPCODE = 0x8c;
   public static final String NAME = "DoubleToFloat";
   public static final String SMALI_NAME = "double-to-float";
 
-  DoubleToFloat(int high, BytecodeStream stream) {
+  DexDoubleToFloat(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public DoubleToFloat(int dest, int source) {
+  public DexDoubleToFloat(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DoubleToInt.java b/src/main/java/com/android/tools/r8/dex/code/DexDoubleToInt.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/DoubleToInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexDoubleToInt.java
index 6d8f506..99debd4 100644
--- a/src/main/java/com/android/tools/r8/code/DoubleToInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexDoubleToInt.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class DoubleToInt extends Format12x {
+
+public class DexDoubleToInt extends DexFormat12x {
 
   public static final int OPCODE = 0x8a;
   public static final String NAME = "DoubleToInt";
   public static final String SMALI_NAME = "doubleto-int";
 
-  DoubleToInt(int high, BytecodeStream stream) {
+  DexDoubleToInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public DoubleToInt(int dest, int source) {
+  public DexDoubleToInt(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DoubleToLong.java b/src/main/java/com/android/tools/r8/dex/code/DexDoubleToLong.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/DoubleToLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexDoubleToLong.java
index d9fa0c5..0ea8942 100644
--- a/src/main/java/com/android/tools/r8/code/DoubleToLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexDoubleToLong.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class DoubleToLong extends Format12x {
+
+public class DexDoubleToLong extends DexFormat12x {
 
   public static final int OPCODE = 0x8b;
   public static final String NAME = "DoubleToLong";
   public static final String SMALI_NAME = "double-to-long";
 
-  DoubleToLong(int high, BytecodeStream stream) {
+  DexDoubleToLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public DoubleToLong(int dest, int source) {
+  public DexDoubleToLong(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/FillArrayData.java b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayData.java
similarity index 85%
rename from src/main/java/com/android/tools/r8/code/FillArrayData.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFillArrayData.java
index a49a31d..de478d7 100644
--- a/src/main/java/com/android/tools/r8/code/FillArrayData.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayData.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.naming.ClassNameMapper;
 
-public class FillArrayData extends Format31t {
+public class DexFillArrayData extends DexFormat31t {
 
   public static final int OPCODE = 0x26;
   public static final String NAME = "FillArrayData";
   public static final String SMALI_NAME = "fill-array-data";
 
-  FillArrayData(int high, BytecodeStream stream) {
+  DexFillArrayData(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public FillArrayData(int value) {
+  public DexFillArrayData(int value) {
     super(value, -1);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/FillArrayDataPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java
similarity index 85%
rename from src/main/java/com/android/tools/r8/code/FillArrayDataPayload.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java
index cab0270..11b34be 100644
--- a/src/main/java/com/android/tools/r8/code/FillArrayDataPayload.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
@@ -15,17 +15,17 @@
 import java.nio.ShortBuffer;
 import java.util.Arrays;
 
-public class FillArrayDataPayload extends Nop {
+public class DexFillArrayDataPayload extends DexNop {
 
   public final int element_width;
   public final long size;
   public final short[] data;
 
-  private static void specify(StructuralSpecification<FillArrayDataPayload, ?> spec) {
+  private static void specify(StructuralSpecification<DexFillArrayDataPayload, ?> spec) {
     spec.withInt(i -> i.element_width).withLong(i -> i.size).withShortArray(i -> i.data);
   }
 
-  FillArrayDataPayload(int high, BytecodeStream stream) {
+  DexFillArrayDataPayload(int high, BytecodeStream stream) {
     super(high, stream);
     element_width = read16BitValue(stream);
     size = read32BitValue(stream);
@@ -39,7 +39,7 @@
     }
   }
 
-  public FillArrayDataPayload(int element_width, long size, short[] data) {
+  public DexFillArrayDataPayload(int element_width, long size, short[] data) {
     this.element_width = element_width;
     this.size = size;
     this.data = data;
@@ -57,7 +57,7 @@
       GraphLens graphLens,
       ObjectToOffsetMapping mapping,
       LensCodeRewriterUtils rewriter) {
-    writeFirst(3, dest);  // Pseudo-opcode = 0x0300
+    writeFirst(3, dest); // Pseudo-opcode = 0x0300
     write16BitValue(element_width, dest);
     write32BitValue(size, dest);
     for (short datum : data) {
@@ -66,8 +66,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (FillArrayDataPayload) other, FillArrayDataPayload::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFillArrayDataPayload) other, DexFillArrayDataPayload::specify);
   }
 
   @Override
@@ -86,8 +86,12 @@
 
   @Override
   public String toString(ClassNameMapper naming) {
-    return super.toString(naming) + "[FillArrayPayload], " +
-        "width: " + element_width + ", size:  " + size;
+    return super.toString(naming)
+        + "[FillArrayPayload], "
+        + "width: "
+        + element_width
+        + ", size:  "
+        + size;
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/FilledNewArray.java b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java
similarity index 84%
rename from src/main/java/com/android/tools/r8/code/FilledNewArray.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java
index 5198876..add1531 100644
--- a/src/main/java/com/android/tools/r8/code/FilledNewArray.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.DexType;
@@ -13,17 +13,17 @@
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
 import java.nio.ShortBuffer;
 
-public class FilledNewArray extends Format35c<DexType> {
+public class DexFilledNewArray extends DexFormat35c<DexType> {
 
   public static final int OPCODE = 0x24;
   public static final String NAME = "FilledNewArray";
   public static final String SMALI_NAME = "filled-new-array";
 
-  FilledNewArray(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexFilledNewArray(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getTypeMap());
   }
 
-  public FilledNewArray(int size, DexType type, int v0, int v1, int v2, int v3, int v4) {
+  public DexFilledNewArray(int size, DexType type, int v0, int v1, int v2, int v3, int v4) {
     super(size, type, v0, v1, v2, v3, v4);
   }
 
@@ -58,7 +58,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInvokeNewArray(getType(), A, new int[]{C, D, E, F, G});
+    builder.addInvokeNewArray(getType(), A, new int[] {C, D, E, F, G});
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/FilledNewArrayRange.java b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java
similarity index 87%
rename from src/main/java/com/android/tools/r8/code/FilledNewArrayRange.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java
index de651f5..c5938dc 100644
--- a/src/main/java/com/android/tools/r8/code/FilledNewArrayRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.DexType;
@@ -13,17 +13,17 @@
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
 import java.nio.ShortBuffer;
 
-public class FilledNewArrayRange extends Format3rc<DexType> {
+public class DexFilledNewArrayRange extends DexFormat3rc<DexType> {
 
   public static final int OPCODE = 0x25;
   public static final String NAME = "FilledNewArrayRange";
   public static final String SMALI_NAME = "filled-new-array/range";
 
-  FilledNewArrayRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexFilledNewArrayRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getTypeMap());
   }
 
-  public FilledNewArrayRange(int firstContentRegister, int size, DexType type) {
+  public DexFilledNewArrayRange(int firstContentRegister, int size, DexType type) {
     super(firstContentRegister, size, type);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/FloatToDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexFloatToDouble.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/FloatToDouble.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFloatToDouble.java
index 5b11258..8536b7e 100644
--- a/src/main/java/com/android/tools/r8/code/FloatToDouble.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFloatToDouble.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class FloatToDouble extends Format12x {
+public class DexFloatToDouble extends DexFormat12x {
 
   public static final int OPCODE = 0x89;
   public static final String NAME = "FloatToDouble";
   public static final String SMALI_NAME = "float-to-double";
 
-  FloatToDouble(int high, BytecodeStream stream) {
+  DexFloatToDouble(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public FloatToDouble(int dest, int source) {
+  public DexFloatToDouble(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/FloatToInt.java b/src/main/java/com/android/tools/r8/dex/code/DexFloatToInt.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/FloatToInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFloatToInt.java
index d0d706f..cf95583 100644
--- a/src/main/java/com/android/tools/r8/code/FloatToInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFloatToInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class FloatToInt extends Format12x {
+public class DexFloatToInt extends DexFormat12x {
 
   public static final int OPCODE = 0x87;
   public static final String NAME = "FloatToInt";
   public static final String SMALI_NAME = "float-to-int";
 
-  FloatToInt(int high, BytecodeStream stream) {
+  DexFloatToInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public FloatToInt(int dest, int source) {
+  public DexFloatToInt(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/FloatToLong.java b/src/main/java/com/android/tools/r8/dex/code/DexFloatToLong.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/FloatToLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFloatToLong.java
index 82346b0..3c7d3b4 100644
--- a/src/main/java/com/android/tools/r8/code/FloatToLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFloatToLong.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class FloatToLong extends Format12x {
+
+public class DexFloatToLong extends DexFormat12x {
 
   public static final int OPCODE = 0x88;
   public static final String NAME = "FloatToLong";
   public static final String SMALI_NAME = "float-to-long";
 
-  FloatToLong(int high, BytecodeStream stream) {
+  DexFloatToLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public FloatToLong(int dest, int source) {
+  public DexFloatToLong(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/Format10t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/Format10t.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java
index 9b2b11c..dbbecdb 100644
--- a/src/main/java/com/android/tools/r8/code/Format10t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.GraphLens;
@@ -12,18 +12,18 @@
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import java.nio.ShortBuffer;
 
-abstract class Format10t extends Base1Format {
+abstract class DexFormat10t extends DexBase1Format {
 
   public /* offset */ byte AA;
 
   // +AA | op
-  Format10t(int high, BytecodeStream stream) {
+  DexFormat10t(int high, BytecodeStream stream) {
     super(stream);
     // AA is an offset, so convert to signed.
     AA = (byte) high;
   }
 
-  protected Format10t(int AA) {
+  protected DexFormat10t(int AA) {
     assert Byte.MIN_VALUE <= AA && AA <= Byte.MAX_VALUE;
     this.AA = (byte) AA;
   }
@@ -44,8 +44,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visitInt(AA, ((Format10t) other).AA);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visitInt(AA, ((DexFormat10t) other).AA);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format10x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java
similarity index 87%
rename from src/main/java/com/android/tools/r8/code/Format10x.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java
index bc8feed..72bfaee 100644
--- a/src/main/java/com/android/tools/r8/code/Format10x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.GraphLens;
@@ -11,16 +11,15 @@
 import com.android.tools.r8.naming.ClassNameMapper;
 import java.nio.ShortBuffer;
 
-abstract class Format10x extends Base1Format {
+abstract class DexFormat10x extends DexBase1Format {
 
   // øø | op
-  Format10x(int high, BytecodeStream stream) {
+  DexFormat10x(int high, BytecodeStream stream) {
     // Intentionally left empty.
     super(stream);
   }
 
-  protected Format10x() {
-  }
+  protected DexFormat10x() {}
 
   @Override
   public void write(
diff --git a/src/main/java/com/android/tools/r8/code/Format11n.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/Format11n.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java
index 27c0d27..5010e51 100644
--- a/src/main/java/com/android/tools/r8/code/Format11n.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -14,16 +14,16 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-abstract class Format11n extends Base1Format {
+abstract class DexFormat11n extends DexBase1Format {
 
   public final byte A, B;
 
-  private static void specify(StructuralSpecification<Format11n, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat11n, ?> spec) {
     spec.withInt(i -> i.A).withInt(i -> i.B);
   }
 
   // #+B | vA | op
-  /*package*/ Format11n(int high, BytecodeStream stream) {
+  /*package*/ DexFormat11n(int high, BytecodeStream stream) {
     super(stream);
     A = (byte) (high & 0xf);
     // Sign extend 4bit value.
@@ -35,7 +35,7 @@
     }
   }
 
-  /*package*/ Format11n(int A, int B) {
+  /*package*/ DexFormat11n(int A, int B) {
     assert 0 <= A && A <= Constants.U4BIT_MAX;
     assert Constants.S4BIT_MIN <= B && B <= Constants.S4BIT_MAX;
     this.A = (byte) A;
@@ -58,8 +58,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format11n) other, Format11n::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat11n) other, DexFormat11n::specify);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format11x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/Format11x.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java
index 3cc3b73..d9b64d5 100644
--- a/src/main/java/com/android/tools/r8/code/Format11x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -13,17 +13,17 @@
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import java.nio.ShortBuffer;
 
-abstract class Format11x extends Base1Format {
+abstract class DexFormat11x extends DexBase1Format {
 
   public final short AA;
 
   // vAA | op
-  Format11x(int high, BytecodeStream stream) {
+  DexFormat11x(int high, BytecodeStream stream) {
     super(stream);
     AA = (short) high;
   }
 
-  protected Format11x(int AA) {
+  protected DexFormat11x(int AA) {
     assert 0 <= AA && AA <= Constants.U8BIT_MAX;
     this.AA = (short) AA;
   }
@@ -44,8 +44,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visitInt(AA, ((Format11x) other).AA);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visitInt(AA, ((DexFormat11x) other).AA);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format12x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/Format12x.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java
index f3b80aa..74c0f70 100644
--- a/src/main/java/com/android/tools/r8/code/Format12x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -14,22 +14,22 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-abstract class Format12x extends Base1Format {
+abstract class DexFormat12x extends DexBase1Format {
 
   public final byte A, B;
 
-  private static void specify(StructuralSpecification<Format12x, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat12x, ?> spec) {
     spec.withInt(i -> i.A).withInt(i -> i.B);
   }
 
   // vB | vA | op
-  Format12x(int high, BytecodeStream stream) {
+  DexFormat12x(int high, BytecodeStream stream) {
     super(stream);
     A = (byte) (high & 0xF);
     B = (byte) ((high >> 4) & 0xF);
   }
 
-  Format12x(int A, int B) {
+  DexFormat12x(int A, int B) {
     assert 0 <= A && A <= Constants.U4BIT_MAX;
     assert 0 <= B && B <= Constants.U4BIT_MAX;
     this.A = (byte) A;
@@ -52,11 +52,10 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format12x) other, Format12x::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat12x) other, DexFormat12x::specify);
   }
 
-
   @Override
   public String toString(ClassNameMapper naming) {
     return formatString("v" + A + ", v" + B);
diff --git a/src/main/java/com/android/tools/r8/code/Format20t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/Format20t.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java
index c9cd18b..da4183d 100644
--- a/src/main/java/com/android/tools/r8/code/Format20t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.GraphLens;
@@ -12,17 +12,17 @@
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import java.nio.ShortBuffer;
 
-abstract class Format20t extends Base2Format {
+abstract class DexFormat20t extends DexBase2Format {
 
   public /* offset */ short AAAA;
 
   // øø | op | +AAAA
-  Format20t(int high, BytecodeStream stream) {
+  DexFormat20t(int high, BytecodeStream stream) {
     super(stream);
     AAAA = readSigned16BitValue(stream);
   }
 
-  protected Format20t(int AAAA) {
+  protected DexFormat20t(int AAAA) {
     assert Short.MIN_VALUE <= AAAA && AAAA <= Short.MAX_VALUE;
     this.AAAA = (short) AAAA;
   }
@@ -44,8 +44,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visitInt(AAAA, ((Format20t) other).AAAA);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visitInt(AAAA, ((DexFormat20t) other).AAAA);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format21c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21c.java
similarity index 73%
rename from src/main/java/com/android/tools/r8/code/Format21c.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat21c.java
index 9416be7..d942119 100644
--- a/src/main/java/com/android/tools/r8/code/Format21c.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21c.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.IndexedDexItem;
@@ -10,19 +10,19 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.util.function.BiPredicate;
 
-abstract class Format21c<T extends IndexedDexItem> extends Base2Format {
+abstract class DexFormat21c<T extends IndexedDexItem> extends DexBase2Format {
 
   public final short AA;
   public T BBBB;
 
   // AA | op | [type|field|string]@BBBB
-  Format21c(int high, BytecodeStream stream, T[] map) {
+  DexFormat21c(int high, BytecodeStream stream, T[] map) {
     super(stream);
     AA = (short) high;
     BBBB = map[read16BitValue(stream)];
   }
 
-  protected Format21c(int AA, T BBBB) {
+  protected DexFormat21c(int AA, T BBBB) {
     assert 0 <= AA && AA <= Constants.U8BIT_MAX;
     this.AA = (short) AA;
     this.BBBB = BBBB;
@@ -35,14 +35,14 @@
 
   @SuppressWarnings("unchecked")
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
     return visitor.visit(
         this,
-        (Format21c<T>) other,
+        (DexFormat21c<T>) other,
         spec -> spec.withInt(i -> i.AA).withSpec(this::internalSubSpecify));
   }
 
-  abstract void internalSubSpecify(StructuralSpecification<Format21c<T>, ?> spec);
+  abstract void internalSubSpecify(StructuralSpecification<DexFormat21c<T>, ?> spec);
 
   @Override
   public String toString(ClassNameMapper naming) {
@@ -57,11 +57,12 @@
   }
 
   @Override
-  public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
+  public boolean equals(
+      DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
     if (other == null || this.getClass() != other.getClass()) {
       return false;
     }
-    Format21c<?> o = (Format21c<?>) other;
+    DexFormat21c<?> o = (DexFormat21c<?>) other;
     return o.AA == AA && equality.test(BBBB, o.BBBB);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/Format21h.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java
similarity index 78%
rename from src/main/java/com/android/tools/r8/code/Format21h.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java
index 36b9174..e9ea003 100644
--- a/src/main/java/com/android/tools/r8/code/Format21h.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -13,23 +13,23 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-abstract class Format21h extends Base2Format {
+abstract class DexFormat21h extends DexBase2Format {
 
   public final short AA;
   public final char BBBB;
 
-  private static void specify(StructuralSpecification<Format21h, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat21h, ?> spec) {
     spec.withInt(i -> i.AA).withInt(i -> i.BBBB);
   }
 
   // AA | op | BBBB0000[00000000]
-  /*package*/ Format21h(int high, BytecodeStream stream) {
+  /*package*/ DexFormat21h(int high, BytecodeStream stream) {
     super(stream);
     AA = (short) high;
     BBBB = read16BitValue(stream);
   }
 
-  /*package*/ Format21h(int AA, int BBBB) {
+  /*package*/ DexFormat21h(int AA, int BBBB) {
     assert 0 <= AA && AA <= Constants.U8BIT_MAX;
     assert 0 <= BBBB && BBBB <= Constants.U16BIT_MAX;
     this.AA = (short) AA;
@@ -53,8 +53,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format21h) other, Format21h::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat21h) other, DexFormat21h::specify);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format21s.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/Format21s.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java
index 550fdd4..d38324f 100644
--- a/src/main/java/com/android/tools/r8/code/Format21s.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -15,23 +15,23 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-abstract class Format21s extends Base2Format {
+abstract class DexFormat21s extends DexBase2Format {
 
   public final short AA;
   public final short BBBB;
 
-  private static void specify(StructuralSpecification<Format21s, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat21s, ?> spec) {
     spec.withInt(i -> i.AA).withInt(i -> i.BBBB);
   }
 
   // AA | op | #+BBBB
-  /*package*/ Format21s(int high, BytecodeStream stream) {
+  /*package*/ DexFormat21s(int high, BytecodeStream stream) {
     super(stream);
     AA = (short) high;
     BBBB = readSigned16BitValue(stream);
   }
 
-  /*package*/ Format21s(int AA, int BBBB) {
+  /*package*/ DexFormat21s(int AA, int BBBB) {
     assert Short.MIN_VALUE <= BBBB && BBBB <= Short.MAX_VALUE;
     assert 0 <= AA && AA <= Constants.U8BIT_MAX;
     this.AA = (short) AA;
@@ -55,8 +55,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format21s) other, Format21s::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat21s) other, DexFormat21s::specify);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format21t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java
similarity index 84%
rename from src/main/java/com/android/tools/r8/code/Format21t.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java
index bde930d..877808b 100644
--- a/src/main/java/com/android/tools/r8/code/Format21t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -17,23 +17,23 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-public abstract class Format21t extends Base2Format {
+public abstract class DexFormat21t extends DexBase2Format {
 
   public final short AA;
   public /* offset */ short BBBB;
 
-  private static void specify(StructuralSpecification<Format21t, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat21t, ?> spec) {
     spec.withInt(i -> i.AA).withInt(i -> i.BBBB);
   }
 
   // AA | op | +BBBB
-  Format21t(int high, BytecodeStream stream) {
+  DexFormat21t(int high, BytecodeStream stream) {
     super(stream);
     AA = (short) high;
     BBBB = readSigned16BitValue(stream);
   }
 
-  Format21t(int register, int offset) {
+  DexFormat21t(int register, int offset) {
     assert Short.MIN_VALUE <= offset && offset <= Short.MAX_VALUE;
     assert 0 <= register && register <= Constants.U8BIT_MAX;
     AA = (short) register;
@@ -57,8 +57,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format21t) other, Format21t::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat21t) other, DexFormat21t::specify);
   }
 
   public abstract Type getType();
@@ -67,7 +67,7 @@
 
   @Override
   public int[] getTargets() {
-    return new int[]{BBBB, getSize()};
+    return new int[] {BBBB, getSize()};
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format22b.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/Format22b.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java
index 6f79b50..eab6c99 100644
--- a/src/main/java/com/android/tools/r8/code/Format22b.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -15,25 +15,25 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-public abstract class Format22b extends Base2Format {
+public abstract class DexFormat22b extends DexBase2Format {
 
   public final short AA;
   public final short BB;
   public final byte CC;
 
-  private static void specify(StructuralSpecification<Format22b, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat22b, ?> spec) {
     spec.withInt(i -> i.AA).withInt(i -> i.BB).withInt(i -> i.CC);
   }
 
   // vAA | op | #+CC | VBB
-  /*package*/ Format22b(int high, BytecodeStream stream) {
+  /*package*/ DexFormat22b(int high, BytecodeStream stream) {
     super(stream);
     AA = (short) high;
     CC = readSigned8BitValue(stream);
     BB = read8BitValue(stream);
   }
 
-  /*package*/ Format22b(int AA, int BB, int CC) {
+  /*package*/ DexFormat22b(int AA, int BB, int CC) {
     assert 0 <= AA && AA <= Constants.U8BIT_MAX;
     assert 0 <= BB && BB <= Constants.U8BIT_MAX;
     assert Byte.MIN_VALUE <= CC && CC <= Byte.MAX_VALUE;
@@ -59,8 +59,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format22b) other, Format22b::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat22b) other, DexFormat22b::specify);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format22c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22c.java
similarity index 71%
rename from src/main/java/com/android/tools/r8/code/Format22c.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat22c.java
index 536ec65..d406aad 100644
--- a/src/main/java/com/android/tools/r8/code/Format22c.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22c.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.DexReference;
@@ -11,25 +11,26 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.util.function.BiPredicate;
 
-public abstract class Format22c<T extends DexReference> extends Base2Format {
+public abstract class DexFormat22c<T extends DexReference> extends DexBase2Format {
 
   public final byte A;
   public final byte B;
   public T CCCC;
 
-  private static void specify(StructuralSpecification<Format22c<? extends DexReference>, ?> spec) {
+  private static void specify(
+      StructuralSpecification<DexFormat22c<? extends DexReference>, ?> spec) {
     spec.withInt(i -> i.A).withInt(i -> i.B).withDexReference(i -> i.CCCC);
   }
 
   // vB | vA | op | [type|field]@CCCC
-  /*package*/ Format22c(int high, BytecodeStream stream, T[] map) {
+  /*package*/ DexFormat22c(int high, BytecodeStream stream, T[] map) {
     super(stream);
     A = (byte) (high & 0xf);
     B = (byte) ((high >> 4) & 0xf);
     CCCC = map[read16BitValue(stream)];
   }
 
-  /*package*/ Format22c(int A, int B, T CCCC) {
+  /*package*/ DexFormat22c(int A, int B, T CCCC) {
     assert 0 <= A && A <= Constants.U4BIT_MAX;
     assert 0 <= B && B <= Constants.U4BIT_MAX;
     this.A = (byte) A;
@@ -43,8 +44,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format22c<? extends DexReference>) other, Format22c::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat22c<? extends DexReference>) other, DexFormat22c::specify);
   }
 
   @Override
@@ -60,11 +61,12 @@
   }
 
   @Override
-  public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
+  public boolean equals(
+      DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
     if (other == null || this.getClass() != other.getClass()) {
       return false;
     }
-    Format22c<?> o = (Format22c<?>) other;
+    DexFormat22c<?> o = (DexFormat22c<?>) other;
     return o.A == A && o.B == B && equality.test(CCCC, o.CCCC);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/Format22s.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/Format22s.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java
index efa14d2..7c2f81d 100644
--- a/src/main/java/com/android/tools/r8/code/Format22s.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -15,25 +15,25 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-public abstract class Format22s extends Base2Format {
+public abstract class DexFormat22s extends DexBase2Format {
 
   public final byte A;
   public final byte B;
   public final short CCCC;
 
-  private static void specify(StructuralSpecification<Format22s, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat22s, ?> spec) {
     spec.withInt(i -> i.A).withInt(i -> i.B).withInt(i -> i.CCCC);
   }
 
   // vB | vA | op | #+CCCC
-  /*package*/ Format22s(int high, BytecodeStream stream) {
+  /*package*/ DexFormat22s(int high, BytecodeStream stream) {
     super(stream);
     A = (byte) (high & 0xf);
     B = (byte) ((high >> 4) & 0xf);
     CCCC = readSigned16BitValue(stream);
   }
 
-  /*package*/ Format22s(int A, int B, int CCCC) {
+  /*package*/ DexFormat22s(int A, int B, int CCCC) {
     assert 0 <= A && A <= Constants.U4BIT_MAX;
     assert 0 <= B && B <= Constants.U4BIT_MAX;
     assert Short.MIN_VALUE <= CCCC && CCCC <= Short.MAX_VALUE;
@@ -59,8 +59,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format22s) other, Format22s::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat22s) other, DexFormat22s::specify);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format22t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java
similarity index 84%
rename from src/main/java/com/android/tools/r8/code/Format22t.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java
index 9688b4e..88d1325 100644
--- a/src/main/java/com/android/tools/r8/code/Format22t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -17,25 +17,25 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-public abstract class Format22t extends Base2Format {
+public abstract class DexFormat22t extends DexBase2Format {
 
   public final byte A;
   public final byte B;
   public /* offset */ short CCCC;
 
-  private static void specify(StructuralSpecification<Format22t, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat22t, ?> spec) {
     spec.withInt(i -> i.A).withInt(i -> i.B).withInt(i -> i.CCCC);
   }
 
   // vB | vA | op | +CCCC
-  Format22t(int high, BytecodeStream stream) {
+  DexFormat22t(int high, BytecodeStream stream) {
     super(stream);
     A = (byte) (high & 0xf);
     B = (byte) ((high >> 4) & 0xf);
     CCCC = readSigned16BitValue(stream);
   }
 
-  Format22t(int register1, int register2, int offset) {
+  DexFormat22t(int register1, int register2, int offset) {
     assert 0 <= register1 && register1 <= Constants.U4BIT_MAX;
     assert 0 <= register2 && register2 <= Constants.U4BIT_MAX;
     assert Short.MIN_VALUE <= offset && offset <= Short.MAX_VALUE;
@@ -61,8 +61,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format22t) other, Format22t::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat22t) other, DexFormat22t::specify);
   }
 
   public abstract Type getType();
@@ -71,7 +71,7 @@
 
   @Override
   public int[] getTargets() {
-    return new int[]{CCCC, getSize()};
+    return new int[] {CCCC, getSize()};
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format22x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java
similarity index 77%
rename from src/main/java/com/android/tools/r8/code/Format22x.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java
index 1d9d8ba..0db6f83 100644
--- a/src/main/java/com/android/tools/r8/code/Format22x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -14,23 +14,23 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-abstract class Format22x extends Base2Format {
+abstract class DexFormat22x extends DexBase2Format {
 
   public final short AA;
   public final char BBBB;
 
-  private static void specify(StructuralSpecification<Format22x, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat22x, ?> spec) {
     spec.withInt(i -> i.AA).withInt(i -> i.BBBB);
   }
 
   // AA | op | vBBBB
-  Format22x(int high, BytecodeStream stream) {
+  DexFormat22x(int high, BytecodeStream stream) {
     super(stream);
     AA = (short) high;
     BBBB = read16BitValue(stream);
   }
 
-  Format22x(int dest, int src) {
+  DexFormat22x(int dest, int src) {
     assert 0 <= dest && dest <= Constants.U8BIT_MAX;
     assert 0 <= src && src <= Constants.U16BIT_MAX;
     AA = (short) dest;
@@ -54,19 +54,18 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format22x) other, Format22x::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat22x) other, DexFormat22x::specify);
   }
 
-
   @Override
   public String toString(ClassNameMapper naming) {
-    return formatString("v" + AA + ", v" + (int)BBBB);
+    return formatString("v" + AA + ", v" + (int) BBBB);
   }
 
   @Override
   public String toSmaliString(ClassNameMapper naming) {
-    return formatSmaliString("v" + AA + ", v" + (int)BBBB);
+    return formatSmaliString("v" + AA + ", v" + (int) BBBB);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format23x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/Format23x.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java
index ca3ef80..583cff3 100644
--- a/src/main/java/com/android/tools/r8/code/Format23x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -14,25 +14,25 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-abstract class Format23x extends Base2Format {
+abstract class DexFormat23x extends DexBase2Format {
 
   public final short AA;
   public final short BB;
   public final short CC;
 
-  private static void specify(StructuralSpecification<Format23x, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat23x, ?> spec) {
     spec.withInt(i -> i.AA).withInt(i -> i.BB).withInt(i -> i.CC);
   }
 
   // vAA | op | vCC | vBB
-  Format23x(int high, BytecodeStream stream) {
+  DexFormat23x(int high, BytecodeStream stream) {
     super(stream);
     AA = (short) high;
     CC = read8BitValue(stream);
     BB = read8BitValue(stream);
   }
 
-  Format23x(int AA, int BB, int CC) {
+  DexFormat23x(int AA, int BB, int CC) {
     assert 0 <= AA && AA <= Constants.U8BIT_MAX;
     assert 0 <= BB && BB <= Constants.U8BIT_MAX;
     assert 0 <= CC && CC <= Constants.U8BIT_MAX;
@@ -58,8 +58,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format23x) other, Format23x::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat23x) other, DexFormat23x::specify);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format30t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/Format30t.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java
index ba986cc..b1372da 100644
--- a/src/main/java/com/android/tools/r8/code/Format30t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.GraphLens;
@@ -12,17 +12,17 @@
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import java.nio.ShortBuffer;
 
-abstract class Format30t extends Base3Format {
+abstract class DexFormat30t extends DexBase3Format {
 
   public /* offset */ int AAAAAAAA;
 
   // øø | op | AAAAlo | AAAAhi
-  Format30t(int high, BytecodeStream stream) {
+  DexFormat30t(int high, BytecodeStream stream) {
     super(stream);
     AAAAAAAA = readSigned32BitValue(stream);
   }
 
-  protected Format30t(int AAAAAAAA) {
+  protected DexFormat30t(int AAAAAAAA) {
     this.AAAAAAAA = AAAAAAAA;
   }
 
@@ -43,8 +43,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visitInt(AAAAAAAA, ((Format30t) other).AAAAAAAA);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visitInt(AAAAAAAA, ((DexFormat30t) other).AAAAAAAA);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format31c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java
similarity index 78%
rename from src/main/java/com/android/tools/r8/code/Format31c.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java
index 6664662..b964ee3 100644
--- a/src/main/java/com/android/tools/r8/code/Format31c.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import static com.android.tools.r8.dex.Constants.U8BIT_MAX;
 
@@ -18,23 +18,23 @@
 import java.nio.ShortBuffer;
 import java.util.function.BiPredicate;
 
-abstract class Format31c extends Base3Format {
+abstract class DexFormat31c extends DexBase3Format {
 
   public final short AA;
   public DexString BBBBBBBB;
 
-  private static void specify(StructuralSpecification<Format31c, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat31c, ?> spec) {
     spec.withInt(i -> i.AA).withItem(i -> i.BBBBBBBB);
   }
 
   // vAA | op | string@BBBBlo | string@#+BBBBhi
-  Format31c(int high, BytecodeStream stream, DexString[] map) {
+  DexFormat31c(int high, BytecodeStream stream, DexString[] map) {
     super(stream);
     AA = (short) high;
     BBBBBBBB = map[(int) read32BitValue(stream)];
   }
 
-  Format31c(int AA, DexString BBBBBBBB) {
+  DexFormat31c(int AA, DexString BBBBBBBB) {
     assert 0 <= AA && AA <= U8BIT_MAX;
     this.AA = (short) AA;
     this.BBBBBBBB = BBBBBBBB;
@@ -57,8 +57,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format31c) other, Format31c::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat31c) other, DexFormat31c::specify);
   }
 
   @Override
@@ -77,11 +77,12 @@
   }
 
   @Override
-  public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
+  public boolean equals(
+      DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
     if (other == null || (this.getClass() != other.getClass())) {
       return false;
     }
-    Format31c o = (Format31c) other;
+    DexFormat31c o = (DexFormat31c) other;
     return o.AA == AA && equality.test(BBBBBBBB, o.BBBBBBBB);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/Format31i.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/Format31i.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java
index c2fa1b1..9014f21 100644
--- a/src/main/java/com/android/tools/r8/code/Format31i.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -14,23 +14,23 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-abstract class Format31i extends Base3Format {
+abstract class DexFormat31i extends DexBase3Format {
 
   public final short AA;
   public final int BBBBBBBB;
 
-  private static void specify(StructuralSpecification<Format31i, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat31i, ?> spec) {
     spec.withInt(i -> i.AA).withInt(i -> i.BBBBBBBB);
   }
 
   // vAA | op | #+BBBBlo | #+BBBBhi
-  /*package*/ Format31i(int high, BytecodeStream stream) {
+  /*package*/ DexFormat31i(int high, BytecodeStream stream) {
     super(stream);
     AA = (short) high;
     BBBBBBBB = readSigned32BitValue(stream);
   }
 
-  /*package*/ Format31i(int AA, int BBBBBBBB) {
+  /*package*/ DexFormat31i(int AA, int BBBBBBBB) {
     assert 0 <= AA && AA <= Constants.U8BIT_MAX;
     this.AA = (short) AA;
     this.BBBBBBBB = BBBBBBBB;
@@ -53,8 +53,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format31i) other, Format31i::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat31i) other, DexFormat31i::specify);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format31t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/Format31t.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java
index f85aca6..e9f1ae5 100644
--- a/src/main/java/com/android/tools/r8/code/Format31t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -14,23 +14,23 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-public abstract class Format31t extends Base3Format {
+public abstract class DexFormat31t extends DexBase3Format {
 
   public final short AA;
   protected /* offset */ int BBBBBBBB;
 
-  private static void specify(StructuralSpecification<Format31t, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat31t, ?> spec) {
     spec.withInt(i -> i.AA).withInt(i -> i.BBBBBBBB);
   }
 
   // vAA | op | +BBBBlo | +BBBBhi
-  Format31t(int high, BytecodeStream stream) {
+  DexFormat31t(int high, BytecodeStream stream) {
     super(stream);
     AA = (short) high;
     BBBBBBBB = readSigned32BitValue(stream);
   }
 
-  Format31t(int register, int payloadOffset) {
+  DexFormat31t(int register, int payloadOffset) {
     assert 0 <= register && register <= Constants.U8BIT_MAX;
     AA = (short) register;
     BBBBBBBB = payloadOffset;
@@ -68,8 +68,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format31t) other, Format31t::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat31t) other, DexFormat31t::specify);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format32x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/Format32x.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java
index c637383..c854dad 100644
--- a/src/main/java/com/android/tools/r8/code/Format32x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import static com.android.tools.r8.dex.Constants.U16BIT_MAX;
 
@@ -15,23 +15,23 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-abstract class Format32x extends Base3Format {
+abstract class DexFormat32x extends DexBase3Format {
 
   public final int AAAA;
   public final int BBBB;
 
-  private static void specify(StructuralSpecification<Format32x, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat32x, ?> spec) {
     spec.withInt(i -> i.AAAA).withInt(i -> i.BBBB);
   }
 
   // øø | op | AAAA | BBBB
-  Format32x(int high, BytecodeStream stream) {
+  DexFormat32x(int high, BytecodeStream stream) {
     super(stream);
     AAAA = read16BitValue(stream);
     BBBB = read16BitValue(stream);
   }
 
-  Format32x(int dest, int src) {
+  DexFormat32x(int dest, int src) {
     assert 0 <= dest && dest <= U16BIT_MAX;
     assert 0 <= src && src <= U16BIT_MAX;
     AAAA = dest;
@@ -56,8 +56,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format32x) other, Format32x::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat32x) other, DexFormat32x::specify);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format35c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat35c.java
similarity index 77%
rename from src/main/java/com/android/tools/r8/code/Format35c.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat35c.java
index e5d2489..78a5323 100644
--- a/src/main/java/com/android/tools/r8/code/Format35c.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat35c.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.IndexedDexItem;
@@ -11,7 +11,8 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.util.function.BiPredicate;
 
-public abstract class Format35c<T extends IndexedDexItem & StructuralItem<T>> extends Base3Format {
+public abstract class DexFormat35c<T extends IndexedDexItem & StructuralItem<T>>
+    extends DexBase3Format {
 
   public final byte A;
   public final byte C;
@@ -22,7 +23,7 @@
   public T BBBB;
 
   private static <T extends IndexedDexItem & StructuralItem<T>> void specify(
-      StructuralSpecification<Format35c<T>, ?> spec) {
+      StructuralSpecification<DexFormat35c<T>, ?> spec) {
     spec.withInt(i -> i.A)
         .withInt(i -> i.C)
         .withInt(i -> i.D)
@@ -33,7 +34,7 @@
   }
 
   // A | G | op | BBBB | F | E | D | C
-  Format35c(int high, BytecodeStream stream, T[] map) {
+  DexFormat35c(int high, BytecodeStream stream, T[] map) {
     super(stream);
     G = (byte) (high & 0xf);
     A = (byte) ((high >> 4) & 0xf);
@@ -46,7 +47,7 @@
     D = (byte) ((next >> 4) & 0xf);
   }
 
-  Format35c(int A, T BBBB, int C, int D, int E, int F, int G) {
+  DexFormat35c(int A, T BBBB, int C, int D, int E, int F, int G) {
     assert 0 <= A && A <= Constants.U4BIT_MAX;
     assert 0 <= C && C <= Constants.U4BIT_MAX;
     assert 0 <= D && D <= Constants.U4BIT_MAX;
@@ -64,19 +65,19 @@
 
   @Override
   public final int hashCode() {
-    return ((BBBB.hashCode() << 24) | (A << 20) | (C << 16) | (D << 12) | (E << 8) | (F << 4)
-        | G) ^ getClass().hashCode();
+    return ((BBBB.hashCode() << 24) | (A << 20) | (C << 16) | (D << 12) | (E << 8) | (F << 4) | G)
+        ^ getClass().hashCode();
   }
 
   @SuppressWarnings("unchecked")
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format35c<T>) other, Format35c::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat35c<T>) other, DexFormat35c::specify);
   }
 
   private void appendRegisterArguments(StringBuilder builder, String separator) {
     builder.append("{ ");
-    int[] values = new int[]{C, D, E, F, G};
+    int[] values = new int[] {C, D, E, F, G};
     for (int i = 0; i < A; i++) {
       if (i != 0) {
         builder.append(separator);
@@ -110,12 +111,18 @@
   }
 
   @Override
-  public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
+  public boolean equals(
+      DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
     if (other == null || (this.getClass() != other.getClass())) {
       return false;
     }
-    Format35c o = (Format35c) other;
-    return o.A == A && o.C == C && o.D == D && o.E == E && o.F == F && o.G == G
+    DexFormat35c o = (DexFormat35c) other;
+    return o.A == A
+        && o.C == C
+        && o.D == D
+        && o.E == E
+        && o.F == F
+        && o.G == G
         && equality.test(BBBB, o.BBBB);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/Format3rc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat3rc.java
similarity index 79%
rename from src/main/java/com/android/tools/r8/code/Format3rc.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat3rc.java
index 0ceeb4a..01fff36b 100644
--- a/src/main/java/com/android/tools/r8/code/Format3rc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat3rc.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.IndexedDexItem;
@@ -11,26 +11,27 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.util.function.BiPredicate;
 
-public abstract class Format3rc<T extends IndexedDexItem & StructuralItem<T>> extends Base3Format {
+public abstract class DexFormat3rc<T extends IndexedDexItem & StructuralItem<T>>
+    extends DexBase3Format {
 
   public final short AA;
   public final char CCCC;
   public T BBBB;
 
   private static <T extends IndexedDexItem & StructuralItem<T>> void specify(
-      StructuralSpecification<Format3rc<T>, ?> spec) {
+      StructuralSpecification<DexFormat3rc<T>, ?> spec) {
     spec.withInt(i -> i.AA).withInt(i -> i.CCCC).withItem(i -> i.BBBB);
   }
 
   // AA | op | [meth|type]@BBBBB | CCCC
-  Format3rc(int high, BytecodeStream stream, T[] map) {
+  DexFormat3rc(int high, BytecodeStream stream, T[] map) {
     super(stream);
     this.AA = (short) high;
     this.BBBB = map[read16BitValue(stream)];
     this.CCCC = read16BitValue(stream);
   }
 
-  Format3rc(int firstArgumentRegister, int argumentCount, T dexItem) {
+  DexFormat3rc(int firstArgumentRegister, int argumentCount, T dexItem) {
     assert 0 <= firstArgumentRegister && firstArgumentRegister <= Constants.U16BIT_MAX;
     assert 0 <= argumentCount && argumentCount <= Constants.U8BIT_MAX;
     this.CCCC = (char) firstArgumentRegister;
@@ -49,8 +50,8 @@
 
   @SuppressWarnings("unchecked")
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format3rc<T>) other, Format3rc::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat3rc<T>) other, DexFormat3rc::specify);
   }
 
   private void appendRegisterRange(StringBuilder builder) {
@@ -87,11 +88,12 @@
   }
 
   @Override
-  public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
+  public boolean equals(
+      DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
     if (other == null || (this.getClass() != other.getClass())) {
       return false;
     }
-    Format3rc<?> o = (Format3rc<?>) other;
+    DexFormat3rc<?> o = (DexFormat3rc<?>) other;
     return o.AA == AA && o.CCCC == CCCC && equality.test(BBBB, o.BBBB);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/Format45cc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
similarity index 90%
rename from src/main/java/com/android/tools/r8/code/Format45cc.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
index 1542015..58970bd 100644
--- a/src/main/java/com/android/tools/r8/code/Format45cc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import static com.android.tools.r8.dex.Constants.U4BIT_MAX;
 
@@ -21,7 +21,7 @@
 import java.nio.ShortBuffer;
 
 /** Format45cc for instructions of size 4, with 5 registers and 2 constant pool index. */
-public abstract class Format45cc extends Base4Format {
+public abstract class DexFormat45cc extends DexBase4Format {
 
   public final byte A;
   public final byte C;
@@ -32,7 +32,7 @@
   public DexMethod BBBB;
   public DexProto HHHH;
 
-  private static void specify(StructuralSpecification<Format45cc, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat45cc, ?> spec) {
     spec.withInt(i -> i.A)
         .withInt(i -> i.C)
         .withInt(i -> i.D)
@@ -43,7 +43,7 @@
         .withItem(i -> i.HHHH);
   }
 
-  Format45cc(int high, BytecodeStream stream, DexMethod[] methodMap, DexProto[] protoMap) {
+  DexFormat45cc(int high, BytecodeStream stream, DexMethod[] methodMap, DexProto[] protoMap) {
     super(stream);
     G = (byte) (high & 0xf);
     A = (byte) ((high >> 4) & 0xf);
@@ -58,7 +58,7 @@
   }
 
   // A | G | op | [meth]@BBBB | F | E | D | C | [proto]@HHHH
-  protected Format45cc(int A, DexMethod BBBB, DexProto HHHH, int C, int D, int E, int F, int G) {
+  protected DexFormat45cc(int A, DexMethod BBBB, DexProto HHHH, int C, int D, int E, int F, int G) {
     assert 0 <= A && A <= U4BIT_MAX;
     assert 0 <= C && C <= U4BIT_MAX;
     assert 0 <= D && D <= U4BIT_MAX;
@@ -89,8 +89,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format45cc) other, Format45cc::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat45cc) other, DexFormat45cc::specify);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format4rcc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
similarity index 87%
rename from src/main/java/com/android/tools/r8/code/Format4rcc.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
index 4da5b40..f459f21 100644
--- a/src/main/java/com/android/tools/r8/code/Format4rcc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -21,19 +21,19 @@
 import java.util.function.BiPredicate;
 
 /** Format4rcc for instructions of size 4, with a range of registers and 2 constant pool index. */
-public abstract class Format4rcc extends Base4Format {
+public abstract class DexFormat4rcc extends DexBase4Format {
 
   public final short AA;
   public final char CCCC;
   public DexMethod BBBB;
   public DexProto HHHH;
 
-  private static void specify(StructuralSpecification<Format4rcc, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat4rcc, ?> spec) {
     spec.withInt(i -> i.AA).withInt(i -> i.CCCC).withItem(i -> i.BBBB).withItem(i -> i.HHHH);
   }
 
   // AA | op | [meth]@BBBB | CCCC | [proto]@HHHH
-  Format4rcc(int high, BytecodeStream stream, DexMethod[] methodMap, DexProto[] protoMap) {
+  DexFormat4rcc(int high, BytecodeStream stream, DexMethod[] methodMap, DexProto[] protoMap) {
     super(stream);
     this.AA = (short) high;
     this.BBBB = methodMap[read16BitValue(stream)];
@@ -41,7 +41,7 @@
     this.HHHH = protoMap[read16BitValue(stream)];
   }
 
-  Format4rcc(int firstArgumentRegister, int argumentCount, DexMethod method, DexProto proto) {
+  DexFormat4rcc(int firstArgumentRegister, int argumentCount, DexMethod method, DexProto proto) {
     assert 0 <= firstArgumentRegister && firstArgumentRegister <= Constants.U16BIT_MAX;
     assert 0 <= argumentCount && argumentCount <= Constants.U8BIT_MAX;
     this.CCCC = (char) firstArgumentRegister;
@@ -75,8 +75,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format4rcc) other, Format4rcc::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat4rcc) other, DexFormat4rcc::specify);
   }
 
   @Override
@@ -125,11 +125,12 @@
   }
 
   @Override
-  public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
+  public boolean equals(
+      DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
     if (other == null || (this.getClass() != other.getClass())) {
       return false;
     }
-    Format4rcc o = (Format4rcc) other;
+    DexFormat4rcc o = (DexFormat4rcc) other;
     return o.AA == AA
         && o.CCCC == CCCC
         && equality.test(BBBB, o.BBBB)
diff --git a/src/main/java/com/android/tools/r8/code/Format51l.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/Format51l.java
rename to src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java
index 1417bf8..438c4fb 100644
--- a/src/main/java/com/android/tools/r8/code/Format51l.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -14,23 +14,23 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-abstract class Format51l extends Base5Format {
+abstract class DexFormat51l extends DexBase5Format {
 
   public final short AA;
   public final long BBBBBBBBBBBBBBBB;
 
-  private static void specify(StructuralSpecification<Format51l, ?> spec) {
+  private static void specify(StructuralSpecification<DexFormat51l, ?> spec) {
     spec.withInt(i -> i.AA).withLong(i -> i.BBBBBBBBBBBBBBBB);
   }
 
   // AA | op | BBBB | BBBB | BBBB | BBBB
-  Format51l(int high, BytecodeStream stream) {
+  DexFormat51l(int high, BytecodeStream stream) {
     super(stream);
     AA = (short) high;
     BBBBBBBBBBBBBBBB = read64BitValue(stream);
   }
 
-  public Format51l(int AA, long BBBBBBBBBBBBBBBB) {
+  public DexFormat51l(int AA, long BBBBBBBBBBBBBBBB) {
     assert 0 <= AA && AA <= Constants.U8BIT_MAX;
     this.AA = (short) AA;
     this.BBBBBBBBBBBBBBBB = BBBBBBBBBBBBBBBB;
@@ -53,8 +53,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (Format51l) other, Format51l::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexFormat51l) other, DexFormat51l::specify);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Goto.java b/src/main/java/com/android/tools/r8/dex/code/DexGoto.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/Goto.java
rename to src/main/java/com/android/tools/r8/dex/code/DexGoto.java
index fc911ee..6b7c0b2 100644
--- a/src/main/java/com/android/tools/r8/code/Goto.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexGoto.java
@@ -1,21 +1,21 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class Goto extends Format10t {
+public class DexGoto extends DexFormat10t {
 
   public static final int OPCODE = 0x28;
   public static final String NAME = "Goto";
   public static final String SMALI_NAME = "goto";
 
-  Goto(int high, BytecodeStream stream) {
+  DexGoto(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public Goto(int AA) {
+  public DexGoto(int AA) {
     super(AA);
   }
 
@@ -36,7 +36,7 @@
 
   @Override
   public int[] getTargets() {
-    return new int[] { AA };
+    return new int[] {AA};
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Goto16.java b/src/main/java/com/android/tools/r8/dex/code/DexGoto16.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/Goto16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexGoto16.java
index c4cec89..0a41ab6 100644
--- a/src/main/java/com/android/tools/r8/code/Goto16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexGoto16.java
@@ -1,21 +1,21 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class Goto16 extends Format20t {
+public class DexGoto16 extends DexFormat20t {
 
   public static final int OPCODE = 0x29;
   public static final String NAME = "Goto16";
   public static final String SMALI_NAME = "goto/16";
 
-  Goto16(int high, BytecodeStream stream) {
+  DexGoto16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public Goto16(int AAAA) {
+  public DexGoto16(int AAAA) {
     super(AAAA);
   }
 
@@ -36,7 +36,7 @@
 
   @Override
   public int[] getTargets() {
-    return new int[]{AAAA};
+    return new int[] {AAAA};
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Goto32.java b/src/main/java/com/android/tools/r8/dex/code/DexGoto32.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/Goto32.java
rename to src/main/java/com/android/tools/r8/dex/code/DexGoto32.java
index 3a4c6b8..bfa83cc 100644
--- a/src/main/java/com/android/tools/r8/code/Goto32.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexGoto32.java
@@ -1,21 +1,21 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class Goto32 extends Format30t {
+public class DexGoto32 extends DexFormat30t {
 
   public static final int OPCODE = 0x2a;
   public static final String NAME = "Goto32";
   public static final String SMALI_NAME = "goto/32";
 
-  Goto32(int high, BytecodeStream stream) {
+  DexGoto32(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public Goto32(int AAAAAAAA) {
+  public DexGoto32(int AAAAAAAA) {
     super(AAAAAAAA);
   }
 
@@ -36,7 +36,7 @@
 
   @Override
   public int[] getTargets() {
-    return new int[]{AAAAAAAA};
+    return new int[] {AAAAAAAA};
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/IfEq.java b/src/main/java/com/android/tools/r8/dex/code/DexIfEq.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/IfEq.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIfEq.java
index abd77ee..345328f 100644
--- a/src/main/java/com/android/tools/r8/code/IfEq.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIfEq.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.If.Type;
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 
-public class IfEq extends Format22t {
+public class DexIfEq extends DexFormat22t {
 
   public static final int OPCODE = 0x32;
   public static final String NAME = "IfEq";
   public static final String SMALI_NAME = "if-eq";
 
-  IfEq(int high, BytecodeStream stream) {
+  DexIfEq(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IfEq(int register1, int register2, int offset) {
+  public DexIfEq(int register1, int register2, int offset) {
     super(register1, register2, offset);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IfEqz.java b/src/main/java/com/android/tools/r8/dex/code/DexIfEqz.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/IfEqz.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIfEqz.java
index 8bfed6d..517576c 100644
--- a/src/main/java/com/android/tools/r8/code/IfEqz.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIfEqz.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.If.Type;
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 
-public class IfEqz extends Format21t {
+public class DexIfEqz extends DexFormat21t {
 
   public static final int OPCODE = 0x38;
   public static final String NAME = "IfEqz";
   public static final String SMALI_NAME = "if-eqz";
 
-  IfEqz(int high, BytecodeStream stream) {
+  DexIfEqz(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IfEqz(int register, int offset) {
+  public DexIfEqz(int register, int offset) {
     super(register, offset);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IfGe.java b/src/main/java/com/android/tools/r8/dex/code/DexIfGe.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/IfGe.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIfGe.java
index dd123f2..4c49892 100644
--- a/src/main/java/com/android/tools/r8/code/IfGe.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIfGe.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.If.Type;
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 
-public class IfGe extends Format22t {
+public class DexIfGe extends DexFormat22t {
 
   public static final int OPCODE = 0x35;
   public static final String NAME = "IfGe";
   public static final String SMALI_NAME = "if-ge";
 
-  IfGe(int high, BytecodeStream stream) {
+  DexIfGe(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IfGe(int register1, int register2, int offset) {
+  public DexIfGe(int register1, int register2, int offset) {
     super(register1, register2, offset);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IfGez.java b/src/main/java/com/android/tools/r8/dex/code/DexIfGez.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/IfGez.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIfGez.java
index 9ca69c0..6a9b49e 100644
--- a/src/main/java/com/android/tools/r8/code/IfGez.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIfGez.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.If.Type;
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 
-public class IfGez extends Format21t {
+public class DexIfGez extends DexFormat21t {
 
   public static final int OPCODE = 0x3b;
   public static final String NAME = "IfGez";
   public static final String SMALI_NAME = "if-gez";
 
-  IfGez(int high, BytecodeStream stream) {
+  DexIfGez(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IfGez(int register, int offset) {
+  public DexIfGez(int register, int offset) {
     super(register, offset);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IfGt.java b/src/main/java/com/android/tools/r8/dex/code/DexIfGt.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/IfGt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIfGt.java
index 84a8fcb..20abfdc 100644
--- a/src/main/java/com/android/tools/r8/code/IfGt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIfGt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.If.Type;
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 
-public class IfGt extends Format22t {
+public class DexIfGt extends DexFormat22t {
 
   public static final int OPCODE = 0x36;
   public static final String NAME = "IfGt";
   public static final String SMALI_NAME = "if-gt";
 
-  IfGt(int high, BytecodeStream stream) {
+  DexIfGt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IfGt(int register1, int register2, int offset) {
+  public DexIfGt(int register1, int register2, int offset) {
     super(register1, register2, offset);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IfGtz.java b/src/main/java/com/android/tools/r8/dex/code/DexIfGtz.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/IfGtz.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIfGtz.java
index 8567a11..c3a8348 100644
--- a/src/main/java/com/android/tools/r8/code/IfGtz.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIfGtz.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.If.Type;
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 
-public class IfGtz extends Format21t {
+public class DexIfGtz extends DexFormat21t {
 
   public static final int OPCODE = 0x3c;
   public static final String NAME = "IfGtz";
   public static final String SMALI_NAME = "if-gtz";
 
-  IfGtz(int high, BytecodeStream stream) {
+  DexIfGtz(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IfGtz(int register, int offset) {
+  public DexIfGtz(int register, int offset) {
     super(register, offset);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IfLe.java b/src/main/java/com/android/tools/r8/dex/code/DexIfLe.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/IfLe.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIfLe.java
index c313a4f..9fde6a5 100644
--- a/src/main/java/com/android/tools/r8/code/IfLe.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIfLe.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.If.Type;
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 
-public class IfLe extends Format22t {
+public class DexIfLe extends DexFormat22t {
 
   public static final int OPCODE = 0x37;
   public static final String NAME = "IfLe";
   public static final String SMALI_NAME = "if-le";
 
-  IfLe(int high, BytecodeStream stream) {
+  DexIfLe(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IfLe(int register1, int register2, int offset) {
+  public DexIfLe(int register1, int register2, int offset) {
     super(register1, register2, offset);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IfLez.java b/src/main/java/com/android/tools/r8/dex/code/DexIfLez.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/IfLez.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIfLez.java
index 9024a98..04ebeff 100644
--- a/src/main/java/com/android/tools/r8/code/IfLez.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIfLez.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.If.Type;
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 
-public class IfLez extends Format21t {
+public class DexIfLez extends DexFormat21t {
 
   public static final int OPCODE = 0x3d;
   public static final String NAME = "IfLez";
   public static final String SMALI_NAME = "if-lez";
 
-  IfLez(int high, BytecodeStream stream) {
+  DexIfLez(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IfLez(int register, int offset) {
+  public DexIfLez(int register, int offset) {
     super(register, offset);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IfLt.java b/src/main/java/com/android/tools/r8/dex/code/DexIfLt.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/IfLt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIfLt.java
index 556de31..728ba10 100644
--- a/src/main/java/com/android/tools/r8/code/IfLt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIfLt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.If.Type;
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 
-public class IfLt extends Format22t {
+public class DexIfLt extends DexFormat22t {
 
   public static final int OPCODE = 0x34;
   public static final String NAME = "IfLt";
   public static final String SMALI_NAME = "if-lt";
 
-  IfLt(int high, BytecodeStream stream) {
+  DexIfLt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IfLt(int register1, int register2, int offset) {
+  public DexIfLt(int register1, int register2, int offset) {
     super(register1, register2, offset);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IfLtz.java b/src/main/java/com/android/tools/r8/dex/code/DexIfLtz.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/IfLtz.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIfLtz.java
index c19b0d9..0aba44f 100644
--- a/src/main/java/com/android/tools/r8/code/IfLtz.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIfLtz.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.If.Type;
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 
-public class IfLtz extends Format21t {
+public class DexIfLtz extends DexFormat21t {
 
   public static final int OPCODE = 0x3a;
   public static final String NAME = "IfLtz";
   public static final String SMALI_NAME = "if-ltz";
 
-  IfLtz(int high, BytecodeStream stream) {
+  DexIfLtz(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IfLtz(int register, int offset) {
+  public DexIfLtz(int register, int offset) {
     super(register, offset);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IfNe.java b/src/main/java/com/android/tools/r8/dex/code/DexIfNe.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/IfNe.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIfNe.java
index 24e45d9..9919538 100644
--- a/src/main/java/com/android/tools/r8/code/IfNe.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIfNe.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.If.Type;
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 
-public class IfNe extends Format22t {
+public class DexIfNe extends DexFormat22t {
 
   public static final int OPCODE = 0x33;
   public static final String NAME = "IfNe";
   public static final String SMALI_NAME = "if-ne";
 
-  IfNe(int high, BytecodeStream stream) {
+  DexIfNe(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IfNe(int register1, int register2, int offset) {
+  public DexIfNe(int register1, int register2, int offset) {
     super(register1, register2, offset);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IfNez.java b/src/main/java/com/android/tools/r8/dex/code/DexIfNez.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/IfNez.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIfNez.java
index f9057e6..cb74246 100644
--- a/src/main/java/com/android/tools/r8/code/IfNez.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIfNez.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.If.Type;
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 
-public class IfNez extends Format21t {
+public class DexIfNez extends DexFormat21t {
 
   public static final int OPCODE = 0x39;
   public static final String NAME = "IfNez";
   public static final String SMALI_NAME = "if-nez";
 
-  IfNez(int high, BytecodeStream stream) {
+  DexIfNez(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IfNez(int register, int offset) {
+  public DexIfNez(int register, int offset) {
     super(register, offset);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/Iget.java b/src/main/java/com/android/tools/r8/dex/code/DexIget.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/Iget.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIget.java
index ee8e7a0..0329505 100644
--- a/src/main/java/com/android/tools/r8/code/Iget.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIget.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class Iget extends IgetOrIput implements CfOrDexInstanceFieldRead {
+public class DexIget extends DexIgetOrIput implements CfOrDexInstanceFieldRead {
 
   public static final int OPCODE = 0x52;
   public static final String NAME = "Iget";
   public static final String SMALI_NAME = "iget";
 
-  /*package*/ Iget(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIget(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public Iget(int destRegister, int objectRegister, DexField field) {
+  public DexIget(int destRegister, int objectRegister, DexField field) {
     super(destRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IgetBoolean.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetBoolean.java
similarity index 79%
rename from src/main/java/com/android/tools/r8/code/IgetBoolean.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIgetBoolean.java
index 3212878..16bfd6d 100644
--- a/src/main/java/com/android/tools/r8/code/IgetBoolean.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetBoolean.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IgetBoolean extends IgetOrIput implements CfOrDexInstanceFieldRead {
+public class DexIgetBoolean extends DexIgetOrIput implements CfOrDexInstanceFieldRead {
 
   public static final int OPCODE = 0x55;
   public static final String NAME = "IgetBoolean";
   public static final String SMALI_NAME = "iget-boolean";
 
-  /*package*/ IgetBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIgetBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public IgetBoolean(int destRegister, int objectRegister, DexField field) {
+  public DexIgetBoolean(int destRegister, int objectRegister, DexField field) {
     super(destRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IgetByte.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetByte.java
similarity index 79%
rename from src/main/java/com/android/tools/r8/code/IgetByte.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIgetByte.java
index a876d70..a1a04db 100644
--- a/src/main/java/com/android/tools/r8/code/IgetByte.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetByte.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IgetByte extends IgetOrIput implements CfOrDexInstanceFieldRead {
+public class DexIgetByte extends DexIgetOrIput implements CfOrDexInstanceFieldRead {
 
   public static final int OPCODE = 0x56;
   public static final String NAME = "IgetByte";
   public static final String SMALI_NAME = "iget-byte";
 
-  /*package*/ IgetByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIgetByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public IgetByte(int destRegister, int objectRegister, DexField field) {
+  public DexIgetByte(int destRegister, int objectRegister, DexField field) {
     super(destRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IgetChar.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetChar.java
similarity index 79%
rename from src/main/java/com/android/tools/r8/code/IgetChar.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIgetChar.java
index efa458d..a546c34 100644
--- a/src/main/java/com/android/tools/r8/code/IgetChar.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetChar.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IgetChar extends IgetOrIput implements CfOrDexInstanceFieldRead {
+public class DexIgetChar extends DexIgetOrIput implements CfOrDexInstanceFieldRead {
 
   public static final int OPCODE = 0x57;
   public static final String NAME = "IgetChar";
   public static final String SMALI_NAME = "iget-char";
 
-  /*package*/ IgetChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIgetChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public IgetChar(int destRegister, int objectRegister, DexField field) {
+  public DexIgetChar(int destRegister, int objectRegister, DexField field) {
     super(destRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IgetObject.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetObject.java
similarity index 79%
rename from src/main/java/com/android/tools/r8/code/IgetObject.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIgetObject.java
index 93540d6..b9d1e38 100644
--- a/src/main/java/com/android/tools/r8/code/IgetObject.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetObject.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IgetObject extends IgetOrIput implements CfOrDexInstanceFieldRead {
+public class DexIgetObject extends DexIgetOrIput implements CfOrDexInstanceFieldRead {
 
   public static final int OPCODE = 0x54;
   public static final String NAME = "IgetObject";
   public static final String SMALI_NAME = "iget-object";
 
-  /*package*/ IgetObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIgetObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public IgetObject(int destRegister, int objectRegister, DexField field) {
+  public DexIgetObject(int destRegister, int objectRegister, DexField field) {
     super(destRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IgetOrIput.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java
similarity index 85%
rename from src/main/java/com/android/tools/r8/code/IgetOrIput.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java
index 33621e5..2ab30bc 100644
--- a/src/main/java/com/android/tools/r8/code/IgetOrIput.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.DexField;
@@ -11,13 +11,13 @@
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
 import java.nio.ShortBuffer;
 
-public abstract class IgetOrIput extends Format22c<DexField> {
+public abstract class DexIgetOrIput extends DexFormat22c<DexField> {
 
-  IgetOrIput(int high, BytecodeStream stream, DexField[] map) {
+  DexIgetOrIput(int high, BytecodeStream stream, DexField[] map) {
     super(high, stream, map);
   }
 
-  IgetOrIput(int A, int B, DexField CCCC) {
+  DexIgetOrIput(int A, int B, DexField CCCC) {
     super(A, B, CCCC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IgetShort.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetShort.java
similarity index 79%
rename from src/main/java/com/android/tools/r8/code/IgetShort.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIgetShort.java
index 23bd792..653aac0 100644
--- a/src/main/java/com/android/tools/r8/code/IgetShort.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetShort.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IgetShort extends IgetOrIput implements CfOrDexInstanceFieldRead {
+public class DexIgetShort extends DexIgetOrIput implements CfOrDexInstanceFieldRead {
 
   public static final int OPCODE = 0x58;
   public static final String NAME = "IgetShort";
   public static final String SMALI_NAME = "iget-short";
 
-  /*package*/ IgetShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIgetShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public IgetShort(int destRegister, int objectRegister, DexField field) {
+  public DexIgetShort(int destRegister, int objectRegister, DexField field) {
     super(destRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IgetWide.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetWide.java
similarity index 79%
rename from src/main/java/com/android/tools/r8/code/IgetWide.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIgetWide.java
index 12ad976..a2bcf17 100644
--- a/src/main/java/com/android/tools/r8/code/IgetWide.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetWide.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IgetWide extends IgetOrIput implements CfOrDexInstanceFieldRead {
+public class DexIgetWide extends DexIgetOrIput implements CfOrDexInstanceFieldRead {
 
   public static final int OPCODE = 0x53;
   public static final String NAME = "IgetWide";
   public static final String SMALI_NAME = "iget-wide";
 
-  /*package*/ IgetWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIgetWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public IgetWide(int destRegister, int objectRegister, DexField field) {
+  public DexIgetWide(int destRegister, int objectRegister, DexField field) {
     super(destRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DexInitClass.java b/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java
similarity index 90%
rename from src/main/java/com/android/tools/r8/code/DexInitClass.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInitClass.java
index 545c24c..87463b3 100644
--- a/src/main/java/com/android/tools/r8/code/DexInitClass.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java
@@ -2,7 +2,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.errors.Unreachable;
@@ -20,7 +20,7 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-public class DexInitClass extends Base2Format {
+public class DexInitClass extends DexBase2Format {
 
   public static final int OPCODE = 0x60;
   public static final String NAME = "InitClass";
@@ -87,20 +87,20 @@
     switch (type) {
       case INT:
       case FLOAT:
-        return Sget.OPCODE;
+        return DexSget.OPCODE;
       case LONG:
       case DOUBLE:
-        return SgetWide.OPCODE;
+        return DexSgetWide.OPCODE;
       case OBJECT:
-        return SgetObject.OPCODE;
+        return DexSgetObject.OPCODE;
       case BOOLEAN:
-        return SgetBoolean.OPCODE;
+        return DexSgetBoolean.OPCODE;
       case BYTE:
-        return SgetByte.OPCODE;
+        return DexSgetByte.OPCODE;
       case CHAR:
-        return SgetChar.OPCODE;
+        return DexSgetChar.OPCODE;
       case SHORT:
-        return SgetShort.OPCODE;
+        return DexSgetShort.OPCODE;
       default:
         throw new Unreachable("Unexpected type: " + type);
     }
@@ -132,7 +132,7 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
     return visitor.visit(this, (DexInitClass) other, DexInitClass::specify);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/InstanceOf.java b/src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java
similarity index 88%
rename from src/main/java/com/android/tools/r8/code/InstanceOf.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java
index c1b8293..d5eaa35 100644
--- a/src/main/java/com/android/tools/r8/code/InstanceOf.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.DexType;
@@ -14,22 +14,22 @@
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
 import java.nio.ShortBuffer;
 
-public class InstanceOf extends Format22c<DexType> {
+public class DexInstanceOf extends DexFormat22c<DexType> {
 
   public static final int OPCODE = 0x20;
   public static final String NAME = "InstanceOf";
   public static final String SMALI_NAME = "instance-of";
 
-  InstanceOf(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInstanceOf(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getTypeMap());
   }
 
-  public InstanceOf(int dest, int value, DexType type) {
+  public DexInstanceOf(int dest, int value, DexType type) {
     super(dest, value, type);
   }
 
   @Override
-  public InstanceOf asInstanceOf() {
+  public DexInstanceOf asInstanceOf() {
     return this;
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/Instruction.java b/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/code/Instruction.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInstruction.java
index 580d5ef..eebd95a 100644
--- a/src/main/java/com/android/tools/r8/code/Instruction.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.dex.IndexedItemCollection;
@@ -28,20 +28,20 @@
 import java.nio.ShortBuffer;
 import java.util.function.BiPredicate;
 
-public abstract class Instruction implements CfOrDexInstruction, StructuralItem<Instruction> {
-  public static final Instruction[] EMPTY_ARRAY = {};
+public abstract class DexInstruction implements CfOrDexInstruction, StructuralItem<DexInstruction> {
+  public static final DexInstruction[] EMPTY_ARRAY = {};
 
-  public final static int[] NO_TARGETS = null;
-  public final static int[] EXIT_TARGET = {};
+  public static final int[] NO_TARGETS = null;
+  public static final int[] EXIT_TARGET = {};
 
   private int offset;
 
-  Instruction(BytecodeStream stream) {
+  DexInstruction(BytecodeStream stream) {
     // When this constructor is invoked, we have already read 1 ushort from the stream.
     this.offset = stream.getOffset() - 1;
   }
 
-  protected Instruction() {
+  protected DexInstruction() {
     this.offset = -1;
   }
 
@@ -128,8 +128,8 @@
     write16BitValue(index, dest);
   }
 
-  protected void write32BitReference(IndexedDexItem item, ShortBuffer dest,
-      ObjectToOffsetMapping mapping) {
+  protected void write32BitReference(
+      IndexedDexItem item, ShortBuffer dest, ObjectToOffsetMapping mapping) {
     write32BitValue(item.getOffset(mapping), dest);
   }
 
@@ -156,11 +156,11 @@
   }
 
   @Override
-  public Instruction asDexInstruction() {
+  public DexInstruction asDexInstruction() {
     return this;
   }
 
-  public CheckCast asCheckCast() {
+  public DexCheckCast asCheckCast() {
     return null;
   }
 
@@ -168,7 +168,7 @@
     return false;
   }
 
-  public InstanceOf asInstanceOf() {
+  public DexInstanceOf asInstanceOf() {
     return null;
   }
 
@@ -176,7 +176,7 @@
     return false;
   }
 
-  public ConstString asConstString() {
+  public DexConstString asConstString() {
     return null;
   }
 
@@ -184,7 +184,7 @@
     return false;
   }
 
-  public ConstClass asConstClass() {
+  public DexConstClass asConstClass() {
     return null;
   }
 
@@ -204,7 +204,7 @@
     return false;
   }
 
-  public ConstStringJumbo asConstStringJumbo() {
+  public DexConstStringJumbo asConstStringJumbo() {
     return null;
   }
 
@@ -216,7 +216,7 @@
     return false;
   }
 
-  public InvokeVirtual asInvokeVirtual() {
+  public DexInvokeVirtual asInvokeVirtual() {
     return null;
   }
 
@@ -224,12 +224,12 @@
     return false;
   }
 
-  public InvokeVirtualRange asInvokeVirtualRange() {
+  public DexInvokeVirtualRange asInvokeVirtualRange() {
     return null;
   }
 
   public boolean isSimpleNop() {
-    return !isPayload() && this instanceof Nop;
+    return !isPayload() && this instanceof DexNop;
   }
 
   public boolean isPayload() {
@@ -324,12 +324,12 @@
   public abstract int hashCode();
 
   @Override
-  public Instruction self() {
+  public DexInstruction self() {
     return this;
   }
 
   @Override
-  public StructuralMapping<Instruction> getStructuralMapping() {
+  public StructuralMapping<DexInstruction> getStructuralMapping() {
     throw new Unreachable();
   }
 
@@ -338,10 +338,10 @@
   }
 
   // Abstract compare-to called only if the opcode/compare-id of the instruction matches.
-  abstract int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor);
+  abstract int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor);
 
   @Override
-  public final int acceptCompareTo(Instruction other, CompareToVisitor visitor) {
+  public final int acceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
     int opcodeDiff = visitor.visitInt(getCompareToId(), other.getCompareToId());
     if (opcodeDiff != 0) {
       return opcodeDiff;
@@ -367,7 +367,7 @@
 
   public abstract int getSize();
 
-  public String toSmaliString(Instruction payloadUser) {
+  public String toSmaliString(DexInstruction payloadUser) {
     throw new InternalCompilerError("Instruction " + payloadUser + " is not a payload user");
   }
 
@@ -379,7 +379,7 @@
 
   public abstract String toString(ClassNameMapper naming);
 
-  public String toString(ClassNameMapper naming, Instruction payloadUser) {
+  public String toString(ClassNameMapper naming, DexInstruction payloadUser) {
     throw new InternalCompilerError("Instruction " + payloadUser + " is not a payload user");
   }
 
@@ -401,7 +401,8 @@
       GraphLens graphLens,
       LensCodeRewriterUtils rewriter);
 
-  public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
+  public boolean equals(
+      DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) {
     // In the default case, there is nothing to substitute.
     return this.equals(other);
   }
diff --git a/src/main/java/com/android/tools/r8/code/InstructionFactory.java b/src/main/java/com/android/tools/r8/dex/code/DexInstructionFactory.java
similarity index 73%
rename from src/main/java/com/android/tools/r8/code/InstructionFactory.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInstructionFactory.java
index 6b60f29..356535c 100644
--- a/src/main/java/com/android/tools/r8/code/InstructionFactory.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInstructionFactory.java
@@ -1,32 +1,31 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import java.nio.ShortBuffer;
 import java.util.ArrayList;
 import java.util.List;
 
-public class InstructionFactory extends BaseInstructionFactory {
+public class DexInstructionFactory extends DexBaseInstructionFactory {
 
-  static private Instruction readFrom(ShortBufferBytecodeStream stream,
-      OffsetToObjectMapping mapping) {
+  private static DexInstruction readFrom(
+      ShortBufferBytecodeStream stream, OffsetToObjectMapping mapping) {
     int high = stream.nextByte();
     int opcode = stream.nextByte();
     return create(high, opcode, stream, mapping);
   }
 
-  public Instruction[] readSequenceFrom(ShortBuffer buffer, int startIndex, int length,
-      OffsetToObjectMapping mapping) {
-    ShortBufferBytecodeStream range =
-        new ShortBufferBytecodeStream(buffer, startIndex, length);
-    List<Instruction> insn = new ArrayList<>(length);
+  public DexInstruction[] readSequenceFrom(
+      ShortBuffer buffer, int startIndex, int length, OffsetToObjectMapping mapping) {
+    ShortBufferBytecodeStream range = new ShortBufferBytecodeStream(buffer, startIndex, length);
+    List<DexInstruction> insn = new ArrayList<>(length);
     while (range.hasMore()) {
-      Instruction instruction = readFrom(range, mapping);
+      DexInstruction instruction = readFrom(range, mapping);
       insn.add(instruction);
     }
-    return insn.toArray(Instruction.EMPTY_ARRAY);
+    return insn.toArray(DexInstruction.EMPTY_ARRAY);
   }
 
   private static class ShortBufferBytecodeStream implements BytecodeStream {
diff --git a/src/main/java/com/android/tools/r8/code/IntToByte.java b/src/main/java/com/android/tools/r8/dex/code/DexIntToByte.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/IntToByte.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIntToByte.java
index 2f6fde6..b2aefe3 100644
--- a/src/main/java/com/android/tools/r8/code/IntToByte.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIntToByte.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class IntToByte extends Format12x {
+
+public class DexIntToByte extends DexFormat12x {
 
   public static final int OPCODE = 0x8d;
   public static final String NAME = "IntToByte";
   public static final String SMALI_NAME = "int-to-byte";
 
-  IntToByte(int high, BytecodeStream stream) {
+  DexIntToByte(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IntToByte(int dest, int source) {
+  public DexIntToByte(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IntToChar.java b/src/main/java/com/android/tools/r8/dex/code/DexIntToChar.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/IntToChar.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIntToChar.java
index 1994d77..a096373 100644
--- a/src/main/java/com/android/tools/r8/code/IntToChar.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIntToChar.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IntToChar extends Format12x {
+public class DexIntToChar extends DexFormat12x {
 
   public static final int OPCODE = 0x8e;
   public static final String NAME = "IntToChar";
   public static final String SMALI_NAME = "int-to-char";
 
-  IntToChar(int high, BytecodeStream stream) {
+  DexIntToChar(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IntToChar(int dest, int source) {
+  public DexIntToChar(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IntToDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexIntToDouble.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/IntToDouble.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIntToDouble.java
index e7a3a51..f3b1c19 100644
--- a/src/main/java/com/android/tools/r8/code/IntToDouble.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIntToDouble.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IntToDouble extends Format12x {
+public class DexIntToDouble extends DexFormat12x {
 
   public static final int OPCODE = 0x83;
   public static final String NAME = "IntToDouble";
   public static final String SMALI_NAME = "int-to-double";
 
-  IntToDouble(int high, BytecodeStream stream) {
+  DexIntToDouble(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IntToDouble(int dest, int source) {
+  public DexIntToDouble(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IntToFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexIntToFloat.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/IntToFloat.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIntToFloat.java
index 5865d4d..9883869 100644
--- a/src/main/java/com/android/tools/r8/code/IntToFloat.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIntToFloat.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class IntToFloat extends Format12x {
+
+public class DexIntToFloat extends DexFormat12x {
 
   public static final int OPCODE = 0x82;
   public static final String NAME = "IntToFloat";
   public static final String SMALI_NAME = "int-to-float";
 
-  IntToFloat(int high, BytecodeStream stream) {
+  DexIntToFloat(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IntToFloat(int dest, int source) {
+  public DexIntToFloat(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IntToLong.java b/src/main/java/com/android/tools/r8/dex/code/DexIntToLong.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/IntToLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIntToLong.java
index 5a3592e..8c319b1 100644
--- a/src/main/java/com/android/tools/r8/code/IntToLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIntToLong.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IntToLong extends Format12x {
+public class DexIntToLong extends DexFormat12x {
 
   public static final int OPCODE = 0x81;
   public static final String NAME = "IntToLong";
   public static final String SMALI_NAME = "int-to-long";
 
-  IntToLong(int high, BytecodeStream stream) {
+  DexIntToLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IntToLong(int dest, int source) {
+  public DexIntToLong(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IntToShort.java b/src/main/java/com/android/tools/r8/dex/code/DexIntToShort.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/IntToShort.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIntToShort.java
index 6fbdaaa..579cff4 100644
--- a/src/main/java/com/android/tools/r8/code/IntToShort.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIntToShort.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IntToShort extends Format12x {
+public class DexIntToShort extends DexFormat12x {
 
   public static final int OPCODE = 0x8f;
   public static final String NAME = "IntToShort";
   public static final String SMALI_NAME = "int-to-short";
 
-  IntToShort(int high, BytecodeStream stream) {
+  DexIntToShort(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public IntToShort(int dest, int source) {
+  public DexIntToShort(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/InvokeCustom.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java
similarity index 88%
rename from src/main/java/com/android/tools/r8/code/InvokeCustom.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java
index ea07822..4e73b38 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeCustom.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.DexCallSite;
@@ -14,17 +14,17 @@
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
 import java.nio.ShortBuffer;
 
-public class InvokeCustom extends Format35c<DexCallSite> {
+public class DexInvokeCustom extends DexFormat35c<DexCallSite> {
 
   public static final int OPCODE = 0xfc;
   public static final String NAME = "InvokeCustom";
   public static final String SMALI_NAME = "invoke-custom";
 
-  InvokeCustom(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokeCustom(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getCallSiteMap());
   }
 
-  public InvokeCustom(int A, DexCallSite BBBB, int C, int D, int E, int F, int G) {
+  public DexInvokeCustom(int A, DexCallSite BBBB, int C, int D, int E, int F, int G) {
     super(A, BBBB, C, D, E, F, G);
   }
 
@@ -65,7 +65,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInvokeCustomRegisters(getCallSite(), A, new int[]{C, D, E, F, G});
+    builder.addInvokeCustomRegisters(getCallSite(), A, new int[] {C, D, E, F, G});
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/InvokeCustomRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java
similarity index 88%
rename from src/main/java/com/android/tools/r8/code/InvokeCustomRange.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java
index c057c94..bae7f30 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeCustomRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.DexCallSite;
@@ -14,17 +14,17 @@
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
 import java.nio.ShortBuffer;
 
-public class InvokeCustomRange extends Format3rc<DexCallSite> {
+public class DexInvokeCustomRange extends DexFormat3rc<DexCallSite> {
 
   public static final int OPCODE = 0xfd;
   public static final String NAME = "InvokeCustomRange";
   public static final String SMALI_NAME = "invoke-custom/range";
 
-  InvokeCustomRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokeCustomRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getCallSiteMap());
   }
 
-  public InvokeCustomRange(int firstArgumentRegister, int argumentCount, DexCallSite callSite) {
+  public DexInvokeCustomRange(int firstArgumentRegister, int argumentCount, DexCallSite callSite) {
     super(firstArgumentRegister, argumentCount, callSite);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/InvokeDirect.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeDirect.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/InvokeDirect.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeDirect.java
index 4f5938f..b918754 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeDirect.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeDirect.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class InvokeDirect extends InvokeMethod {
+public class DexInvokeDirect extends DexInvokeMethod {
 
   public static final int OPCODE = 0x70;
   public static final String NAME = "InvokeDirect";
   public static final String SMALI_NAME = "invoke-direct";
 
-  InvokeDirect(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokeDirect(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getMethodMap());
   }
 
-  public InvokeDirect(int A, DexMethod BBBB, int C, int D, int E, int F, int G) {
+  public DexInvokeDirect(int A, DexMethod BBBB, int C, int D, int E, int F, int G) {
     super(A, BBBB, C, D, E, F, G);
   }
 
@@ -50,7 +50,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInvokeRegisters(Type.DIRECT, getMethod(), getProto(), A, new int[]{C, D, E, F, G});
+    builder.addInvokeRegisters(Type.DIRECT, getMethod(), getProto(), A, new int[] {C, D, E, F, G});
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/InvokeDirectRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeDirectRange.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/InvokeDirectRange.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeDirectRange.java
index 6f232c0..9134e4a 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeDirectRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeDirectRange.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class InvokeDirectRange extends InvokeMethodRange {
+public class DexInvokeDirectRange extends DexInvokeMethodRange {
 
   public static final int OPCODE = 0x76;
   public static final String NAME = "InvokeDirectRange";
   public static final String SMALI_NAME = "invoke-direct/range";
 
-  InvokeDirectRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokeDirectRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getMethodMap());
   }
 
-  public InvokeDirectRange(int firstArgumentRegister, int argumentCount, DexMethod method) {
+  public DexInvokeDirectRange(int firstArgumentRegister, int argumentCount, DexMethod method) {
     super(firstArgumentRegister, argumentCount, method);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/InvokeInterface.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeInterface.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/InvokeInterface.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeInterface.java
index 2e20c9c..d7a64be 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeInterface.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeInterface.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class InvokeInterface extends InvokeMethod {
+public class DexInvokeInterface extends DexInvokeMethod {
 
   public static final int OPCODE = 0x72;
   public static final String NAME = "InvokeInterface";
   public static final String SMALI_NAME = "invoke-interface";
 
-  InvokeInterface(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokeInterface(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getMethodMap());
   }
 
-  public InvokeInterface(int A, DexMethod BBBB, int C, int D, int E, int F, int G) {
+  public DexInvokeInterface(int A, DexMethod BBBB, int C, int D, int E, int F, int G) {
     super(A, BBBB, C, D, E, F, G);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/InvokeInterfaceRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeInterfaceRange.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/InvokeInterfaceRange.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeInterfaceRange.java
index 7592e3d..b8dfc7b 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeInterfaceRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeInterfaceRange.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class InvokeInterfaceRange extends InvokeMethodRange {
+public class DexInvokeInterfaceRange extends DexInvokeMethodRange {
 
   public static final int OPCODE = 0x78;
   public static final String NAME = "InvokeInterfaceRange";
   public static final String SMALI_NAME = "invoke-interface/range";
 
-  InvokeInterfaceRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokeInterfaceRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getMethodMap());
   }
 
-  public InvokeInterfaceRange(int firstArgumentRegister, int argumentCount, DexMethod method) {
+  public DexInvokeInterfaceRange(int firstArgumentRegister, int argumentCount, DexMethod method) {
     super(firstArgumentRegister, argumentCount, method);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/InvokeMethod.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/code/InvokeMethod.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java
index 9e5d8f2..f5211b1 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeMethod.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.DexMethod;
@@ -13,13 +13,13 @@
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
 import java.nio.ShortBuffer;
 
-public abstract class InvokeMethod extends Format35c<DexMethod> {
+public abstract class DexInvokeMethod extends DexFormat35c<DexMethod> {
 
-  InvokeMethod(int high, BytecodeStream stream, DexMethod[] map) {
+  DexInvokeMethod(int high, BytecodeStream stream, DexMethod[] map) {
     super(high, stream, map);
   }
 
-  InvokeMethod(int A, DexMethod BBBB, int C, int D, int E, int F, int G) {
+  DexInvokeMethod(int A, DexMethod BBBB, int C, int D, int E, int F, int G) {
     super(A, BBBB, C, D, E, F, G);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/InvokeMethodRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java
similarity index 85%
rename from src/main/java/com/android/tools/r8/code/InvokeMethodRange.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java
index ba248e0..db983f1 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeMethodRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.DexMethod;
@@ -13,13 +13,13 @@
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
 import java.nio.ShortBuffer;
 
-public abstract class InvokeMethodRange extends Format3rc<DexMethod> {
+public abstract class DexInvokeMethodRange extends DexFormat3rc<DexMethod> {
 
-  InvokeMethodRange(int high, BytecodeStream stream, DexMethod[] map) {
+  DexInvokeMethodRange(int high, BytecodeStream stream, DexMethod[] map) {
     super(high, stream, map);
   }
 
-  InvokeMethodRange(int firstArgumentRegister, int argumentCount, DexMethod dexItem) {
+  DexInvokeMethodRange(int firstArgumentRegister, int argumentCount, DexMethod dexItem) {
     super(firstArgumentRegister, argumentCount, dexItem);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/InvokePolymorphic.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokePolymorphic.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/code/InvokePolymorphic.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokePolymorphic.java
index d5ecd11..72678f0 100644
--- a/src/main/java/com/android/tools/r8/code/InvokePolymorphic.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokePolymorphic.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProto;
@@ -13,17 +13,17 @@
  * An invoke-polymorphic instruction used to invoke a method in a MethodHandle using either
  * MethodHandle.invoke or MethodHandle.invokeExact.
  */
-public class InvokePolymorphic extends Format45cc {
+public class DexInvokePolymorphic extends DexFormat45cc {
 
   public static final int OPCODE = 0xfa;
   public static final String NAME = "InvokePolymorphic";
   public static final String SMALI_NAME = "invoke-polymorphic";
 
-  InvokePolymorphic(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokePolymorphic(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getMethodMap(), mapping.getProtosMap());
   }
 
-  public InvokePolymorphic(
+  public DexInvokePolymorphic(
       int A, DexMethod BBBB, DexProto HHHH, int C, int D, int E, int F, int G) {
     super(A, BBBB, HHHH, C, D, E, F, G);
   }
diff --git a/src/main/java/com/android/tools/r8/code/InvokePolymorphicRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokePolymorphicRange.java
similarity index 87%
rename from src/main/java/com/android/tools/r8/code/InvokePolymorphicRange.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokePolymorphicRange.java
index 07cf3a0..186952b 100644
--- a/src/main/java/com/android/tools/r8/code/InvokePolymorphicRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokePolymorphicRange.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProto;
@@ -11,17 +11,17 @@
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
 /** An invoke-polymorphic range instruction used to call method with polymorphic signature. */
-public class InvokePolymorphicRange extends Format4rcc {
+public class DexInvokePolymorphicRange extends DexFormat4rcc {
 
   public static final int OPCODE = 0xfb;
   public static final String NAME = "InvokePolymorphicRange";
   public static final String SMALI_NAME = "invoke-polymorphic/range";
 
-  InvokePolymorphicRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokePolymorphicRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getMethodMap(), mapping.getProtosMap());
   }
 
-  public InvokePolymorphicRange(
+  public DexInvokePolymorphicRange(
       int firstArgumentRegister, int argumentCount, DexMethod method, DexProto proto) {
     super(firstArgumentRegister, argumentCount, method, proto);
   }
diff --git a/src/main/java/com/android/tools/r8/code/InvokeStatic.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeStatic.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/InvokeStatic.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeStatic.java
index fb198e4..b645556 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeStatic.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeStatic.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class InvokeStatic extends InvokeMethod {
+public class DexInvokeStatic extends DexInvokeMethod {
 
   public static final int OPCODE = 0x71;
   public static final String NAME = "InvokeStatic";
   public static final String SMALI_NAME = "invoke-static";
 
-  InvokeStatic(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokeStatic(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getMethodMap());
   }
 
-  public InvokeStatic(int A, DexMethod BBBB, int C, int D, int E, int F, int G) {
+  public DexInvokeStatic(int A, DexMethod BBBB, int C, int D, int E, int F, int G) {
     super(A, BBBB, C, D, E, F, G);
   }
 
@@ -50,7 +50,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInvokeRegisters(Type.STATIC, getMethod(), getProto(), A, new int[]{C, D, E, F, G});
+    builder.addInvokeRegisters(Type.STATIC, getMethod(), getProto(), A, new int[] {C, D, E, F, G});
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/InvokeStaticRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeStaticRange.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/InvokeStaticRange.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeStaticRange.java
index de84a90..512632f 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeStaticRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeStaticRange.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class InvokeStaticRange extends InvokeMethodRange {
+public class DexInvokeStaticRange extends DexInvokeMethodRange {
 
   public static final int OPCODE = 0x77;
   public static final String NAME = "InvokeStaticRange";
   public static final String SMALI_NAME = "invoke-static/range";
 
-  InvokeStaticRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokeStaticRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getMethodMap());
   }
 
-  public InvokeStaticRange(int firstArgumentRegister, int argumentCount, DexMethod method) {
+  public DexInvokeStaticRange(int firstArgumentRegister, int argumentCount, DexMethod method) {
     super(firstArgumentRegister, argumentCount, method);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/InvokeSuper.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeSuper.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/InvokeSuper.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeSuper.java
index 24ab80e..3be61ac 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeSuper.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeSuper.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class InvokeSuper extends InvokeMethod {
+public class DexInvokeSuper extends DexInvokeMethod {
 
   public static final int OPCODE = 0x6f;
   public static final String NAME = "InvokeSuper";
   public static final String SMALI_NAME = "invoke-super";
 
-  InvokeSuper(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokeSuper(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getMethodMap());
   }
 
-  public InvokeSuper(int A, DexMethod BBBB, int C, int D, int E, int F, int G) {
+  public DexInvokeSuper(int A, DexMethod BBBB, int C, int D, int E, int F, int G) {
     super(A, BBBB, C, D, E, F, G);
   }
 
@@ -50,7 +50,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInvokeRegisters(Type.SUPER, getMethod(), getProto(), A, new int[]{C, D, E, F, G});
+    builder.addInvokeRegisters(Type.SUPER, getMethod(), getProto(), A, new int[] {C, D, E, F, G});
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/InvokeSuperRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeSuperRange.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/InvokeSuperRange.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeSuperRange.java
index ac820c9..206e74f 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeSuperRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeSuperRange.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class InvokeSuperRange extends InvokeMethodRange {
+public class DexInvokeSuperRange extends DexInvokeMethodRange {
 
   public static final int OPCODE = 0x75;
   public static final String NAME = "InvokeSuperRange";
   public static final String SMALI_NAME = "invoke-super/range";
 
-  InvokeSuperRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokeSuperRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getMethodMap());
   }
 
-  public InvokeSuperRange(int firstArgumentRegister, int argumentCount, DexMethod method) {
+  public DexInvokeSuperRange(int firstArgumentRegister, int argumentCount, DexMethod method) {
     super(firstArgumentRegister, argumentCount, method);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/InvokeVirtual.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeVirtual.java
similarity index 79%
rename from src/main/java/com/android/tools/r8/code/InvokeVirtual.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeVirtual.java
index 27e37c5..f1704e5 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeVirtual.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeVirtual.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class InvokeVirtual extends InvokeMethod {
+public class DexInvokeVirtual extends DexInvokeMethod {
 
   public static final int OPCODE = 0x6e;
   public static final String NAME = "InvokeVirtual";
   public static final String SMALI_NAME = "invoke-virtual";
 
-  InvokeVirtual(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokeVirtual(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getMethodMap());
   }
 
-  public InvokeVirtual(int A, DexMethod BBBB, int C, int D, int E, int F, int G) {
+  public DexInvokeVirtual(int A, DexMethod BBBB, int C, int D, int E, int F, int G) {
     super(A, BBBB, C, D, E, F, G);
   }
 
@@ -49,7 +49,7 @@
   }
 
   @Override
-  public InvokeVirtual asInvokeVirtual() {
+  public DexInvokeVirtual asInvokeVirtual() {
     return this;
   }
 
@@ -60,7 +60,7 @@
 
   @Override
   public void buildIR(IRBuilder builder) {
-    builder.addInvokeRegisters(Type.VIRTUAL, getMethod(), getProto(), A, new int[]{C, D, E, F, G});
+    builder.addInvokeRegisters(Type.VIRTUAL, getMethod(), getProto(), A, new int[] {C, D, E, F, G});
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/InvokeVirtualRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeVirtualRange.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/InvokeVirtualRange.java
rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeVirtualRange.java
index e93733f..97a87f8 100644
--- a/src/main/java/com/android/tools/r8/code/InvokeVirtualRange.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeVirtualRange.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
@@ -9,17 +9,17 @@
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class InvokeVirtualRange extends InvokeMethodRange {
+public class DexInvokeVirtualRange extends DexInvokeMethodRange {
 
   public static final int OPCODE = 0x74;
   public static final String NAME = "InvokeVirtualRange";
   public static final String SMALI_NAME = "invoke-virtual/range";
 
-  InvokeVirtualRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexInvokeVirtualRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getMethodMap());
   }
 
-  public InvokeVirtualRange(int firstArgumentRegister, int argumentCount, DexMethod method) {
+  public DexInvokeVirtualRange(int firstArgumentRegister, int argumentCount, DexMethod method) {
     super(firstArgumentRegister, argumentCount, method);
   }
 
@@ -49,7 +49,7 @@
   }
 
   @Override
-  public InvokeVirtualRange asInvokeVirtualRange() {
+  public DexInvokeVirtualRange asInvokeVirtualRange() {
     return this;
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/Iput.java b/src/main/java/com/android/tools/r8/dex/code/DexIput.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/Iput.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIput.java
index 76f90af..1a1cea9 100644
--- a/src/main/java/com/android/tools/r8/code/Iput.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIput.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class Iput extends IgetOrIput {
+public class DexIput extends DexIgetOrIput {
 
   public static final int OPCODE = 0x59;
   public static final String NAME = "Iput";
   public static final String SMALI_NAME = "iput";
 
-  /*package*/ Iput(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIput(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public Iput(int valueRegister, int objectRegister, DexField field) {
+  public DexIput(int valueRegister, int objectRegister, DexField field) {
     super(valueRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IputBoolean.java b/src/main/java/com/android/tools/r8/dex/code/DexIputBoolean.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/IputBoolean.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIputBoolean.java
index 634657d..501d0e4 100644
--- a/src/main/java/com/android/tools/r8/code/IputBoolean.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIputBoolean.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IputBoolean extends IgetOrIput {
+public class DexIputBoolean extends DexIgetOrIput {
 
   public static final int OPCODE = 0x5c;
   public static final String NAME = "IputBoolean";
   public static final String SMALI_NAME = "iput-boolean";
 
-  /*package*/ IputBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIputBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public IputBoolean(int valueRegister, int objectRegister, DexField field) {
+  public DexIputBoolean(int valueRegister, int objectRegister, DexField field) {
     super(valueRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IputByte.java b/src/main/java/com/android/tools/r8/dex/code/DexIputByte.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/IputByte.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIputByte.java
index b579bec..2d5fec3 100644
--- a/src/main/java/com/android/tools/r8/code/IputByte.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIputByte.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IputByte extends IgetOrIput {
+public class DexIputByte extends DexIgetOrIput {
 
   public static final int OPCODE = 0x5d;
   public static final String NAME = "IputByte";
   public static final String SMALI_NAME = "iput-byte";
 
-  /*package*/ IputByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIputByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public IputByte(int valueRegister, int objectRegister, DexField field) {
+  public DexIputByte(int valueRegister, int objectRegister, DexField field) {
     super(valueRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IputChar.java b/src/main/java/com/android/tools/r8/dex/code/DexIputChar.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/IputChar.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIputChar.java
index 1b0d42d..bf96679 100644
--- a/src/main/java/com/android/tools/r8/code/IputChar.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIputChar.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IputChar extends IgetOrIput {
+public class DexIputChar extends DexIgetOrIput {
 
   public static final int OPCODE = 0x5e;
   public static final String NAME = "IputChar";
   public static final String SMALI_NAME = "iput-char";
 
-  /*package*/ IputChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIputChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public IputChar(int valueRegister, int objectRegister, DexField field) {
+  public DexIputChar(int valueRegister, int objectRegister, DexField field) {
     super(valueRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IputObject.java b/src/main/java/com/android/tools/r8/dex/code/DexIputObject.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/IputObject.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIputObject.java
index 816f81f..3052fec 100644
--- a/src/main/java/com/android/tools/r8/code/IputObject.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIputObject.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IputObject extends IgetOrIput {
+public class DexIputObject extends DexIgetOrIput {
 
   public static final int OPCODE = 0x5b;
   public static final String NAME = "IputObject";
   public static final String SMALI_NAME = "iput-object";
 
-  /*package*/ IputObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIputObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public IputObject(int valueRegister, int objectRegister, DexField field) {
+  public DexIputObject(int valueRegister, int objectRegister, DexField field) {
     super(valueRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IputShort.java b/src/main/java/com/android/tools/r8/dex/code/DexIputShort.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/IputShort.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIputShort.java
index dfa9ff7..d6d32a3 100644
--- a/src/main/java/com/android/tools/r8/code/IputShort.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIputShort.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IputShort extends IgetOrIput {
+public class DexIputShort extends DexIgetOrIput {
 
   public static final int OPCODE = 0x5f;
   public static final String NAME = "IputShort";
   public static final String SMALI_NAME = "iput-short";
 
-  /*package*/ IputShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIputShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public IputShort(int valueRegister, int objectRegister, DexField field) {
+  public DexIputShort(int valueRegister, int objectRegister, DexField field) {
     super(valueRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/IputWide.java b/src/main/java/com/android/tools/r8/dex/code/DexIputWide.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/IputWide.java
rename to src/main/java/com/android/tools/r8/dex/code/DexIputWide.java
index 261dc26..2f70828 100644
--- a/src/main/java/com/android/tools/r8/code/IputWide.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexIputWide.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class IputWide extends IgetOrIput {
+public class DexIputWide extends DexIgetOrIput {
 
   public static final int OPCODE = 0x5a;
   public static final String NAME = "IputWide";
   public static final String SMALI_NAME = "iput-wide";
 
-  /*package*/ IputWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexIputWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public IputWide(int valueRegister, int objectRegister, DexField field) {
+  public DexIputWide(int valueRegister, int objectRegister, DexField field) {
     super(valueRegister, objectRegister, field);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DexItemBasedConstString.java b/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java
similarity index 94%
rename from src/main/java/com/android/tools/r8/code/DexItemBasedConstString.java
rename to src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java
index 70e9c4f..a6930f3 100644
--- a/src/main/java/com/android/tools/r8/code/DexItemBasedConstString.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.errors.Unreachable;
@@ -17,7 +17,7 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-public class DexItemBasedConstString extends Format21c<DexReference> {
+public class DexItemBasedConstString extends DexFormat21c<DexReference> {
 
   public static final String NAME = "DexItemBasedConstString";
   public static final String SMALI_NAME = "const-string*";
@@ -69,7 +69,7 @@
   }
 
   @Override
-  void internalSubSpecify(StructuralSpecification<Format21c<DexReference>, ?> spec) {
+  void internalSubSpecify(StructuralSpecification<DexFormat21c<DexReference>, ?> spec) {
     spec.withDexReference(i -> i.BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/LongToDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexLongToDouble.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/LongToDouble.java
rename to src/main/java/com/android/tools/r8/dex/code/DexLongToDouble.java
index f2ac125..224b047 100644
--- a/src/main/java/com/android/tools/r8/code/LongToDouble.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexLongToDouble.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class LongToDouble extends Format12x {
+
+public class DexLongToDouble extends DexFormat12x {
 
   public static final int OPCODE = 0x86;
   public static final String NAME = "LongToDouble";
   public static final String SMALI_NAME = "long-to-double";
 
-  LongToDouble(int high, BytecodeStream stream) {
+  DexLongToDouble(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public LongToDouble(int dest, int source) {
+  public DexLongToDouble(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/LongToFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexLongToFloat.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/LongToFloat.java
rename to src/main/java/com/android/tools/r8/dex/code/DexLongToFloat.java
index ead1ee2..ddec7bf 100644
--- a/src/main/java/com/android/tools/r8/code/LongToFloat.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexLongToFloat.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class LongToFloat extends Format12x {
+
+public class DexLongToFloat extends DexFormat12x {
 
   public static final int OPCODE = 0x85;
   public static final String NAME = "LongToFloat";
   public static final String SMALI_NAME = "long-to-float";
 
-  LongToFloat(int high, BytecodeStream stream) {
+  DexLongToFloat(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public LongToFloat(int dest, int source) {
+  public DexLongToFloat(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/LongToInt.java b/src/main/java/com/android/tools/r8/dex/code/DexLongToInt.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/LongToInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexLongToInt.java
index bbb10b6..4d912a4 100644
--- a/src/main/java/com/android/tools/r8/code/LongToInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexLongToInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class LongToInt extends Format12x {
+public class DexLongToInt extends DexFormat12x {
 
   public static final int OPCODE = 0x84;
   public static final String NAME = "LongToInt";
   public static final String SMALI_NAME = "long-to-int";
 
-  LongToInt(int high, BytecodeStream stream) {
+  DexLongToInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public LongToInt(int dest, int source) {
+  public DexLongToInt(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MonitorEnter.java b/src/main/java/com/android/tools/r8/dex/code/DexMonitorEnter.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/MonitorEnter.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMonitorEnter.java
index 17c9852..620c557 100644
--- a/src/main/java/com/android/tools/r8/code/MonitorEnter.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMonitorEnter.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.Monitor.Type;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class MonitorEnter extends Format11x {
+
+public class DexMonitorEnter extends DexFormat11x {
 
   public static final int OPCODE = 0x1d;
   public static final String NAME = "MonitorEnter";
   public static final String SMALI_NAME = "monitor-enter";
 
-  MonitorEnter(int high, BytecodeStream stream) {
+  DexMonitorEnter(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MonitorEnter(int register) {
+  public DexMonitorEnter(int register) {
     super(register);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MonitorExit.java b/src/main/java/com/android/tools/r8/dex/code/DexMonitorExit.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/MonitorExit.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMonitorExit.java
index 7725ca0..d001e32 100644
--- a/src/main/java/com/android/tools/r8/code/MonitorExit.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMonitorExit.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.Monitor.Type;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class MonitorExit extends Format11x {
+
+public class DexMonitorExit extends DexFormat11x {
 
   public static final int OPCODE = 0x1e;
   public static final String NAME = "MonitorExit";
   public static final String SMALI_NAME = "monitor-exit";
 
-  MonitorExit(int high, BytecodeStream stream) {
+  DexMonitorExit(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MonitorExit(int register) {
+  public DexMonitorExit(int register) {
     super(register);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/Move.java b/src/main/java/com/android/tools/r8/dex/code/DexMove.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/Move.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMove.java
index 3e750a6..5c45e0c 100644
--- a/src/main/java/com/android/tools/r8/code/Move.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMove.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class Move extends Format12x {
+public class DexMove extends DexFormat12x {
 
   public static final int OPCODE = 0x1;
   public static final String NAME = "Move";
   public static final String SMALI_NAME = "move";
 
-  Move(int high, BytecodeStream stream) {
+  DexMove(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public Move(int dest, int src) {
+  public DexMove(int dest, int src) {
     super(dest, src);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/Move16.java b/src/main/java/com/android/tools/r8/dex/code/DexMove16.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/Move16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMove16.java
index 64a0f7c..a003bc3 100644
--- a/src/main/java/com/android/tools/r8/code/Move16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMove16.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class Move16 extends Format32x {
+public class DexMove16 extends DexFormat32x {
 
   public static final int OPCODE = 0x3;
   public static final String NAME = "Move16";
   public static final String SMALI_NAME = "move/16";
 
-  Move16(int high, BytecodeStream stream) {
+  DexMove16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public Move16(int dest, int src) {
+  public DexMove16(int dest, int src) {
     super(dest, src);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MoveException.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveException.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/MoveException.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMoveException.java
index ca79a0c..1f3888e 100644
--- a/src/main/java/com/android/tools/r8/code/MoveException.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveException.java
@@ -1,21 +1,21 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MoveException extends Format11x {
+public class DexMoveException extends DexFormat11x {
 
   public static final int OPCODE = 0xd;
   public static final String NAME = "MoveException";
   public static final String SMALI_NAME = "move-exception";
 
-  MoveException(int high, BytecodeStream stream) {
+  DexMoveException(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MoveException(int AA) {
+  public DexMoveException(int AA) {
     super(AA);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MoveFrom16.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveFrom16.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/MoveFrom16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMoveFrom16.java
index 51b456e..48f9fa8 100644
--- a/src/main/java/com/android/tools/r8/code/MoveFrom16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveFrom16.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MoveFrom16 extends Format22x {
+public class DexMoveFrom16 extends DexFormat22x {
 
   public static final int OPCODE = 0x2;
   public static final String NAME = "MoveFrom16";
   public static final String SMALI_NAME = "move-from/16";
 
-  MoveFrom16(int high, BytecodeStream stream) {
+  DexMoveFrom16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MoveFrom16(int dest, int src) {
+  public DexMoveFrom16(int dest, int src) {
     super(dest, src);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MoveObject.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveObject.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/MoveObject.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMoveObject.java
index a308ab1..22ee41c 100644
--- a/src/main/java/com/android/tools/r8/code/MoveObject.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveObject.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MoveObject extends Format12x {
+public class DexMoveObject extends DexFormat12x {
 
   public static final int OPCODE = 0x7;
   public static final String NAME = "MoveObject";
   public static final String SMALI_NAME = "move-object";
 
-  MoveObject(int high, BytecodeStream stream) {
+  DexMoveObject(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MoveObject(int dest, int src) {
+  public DexMoveObject(int dest, int src) {
     super(dest, src);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MoveObject16.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveObject16.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/MoveObject16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMoveObject16.java
index a7eb12c..3598213 100644
--- a/src/main/java/com/android/tools/r8/code/MoveObject16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveObject16.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MoveObject16 extends Format32x {
+public class DexMoveObject16 extends DexFormat32x {
 
   public static final int OPCODE = 0x9;
   public static final String NAME = "MoveObject16";
   public static final String SMALI_NAME = "move-object/16";
 
-  MoveObject16(int high, BytecodeStream stream) {
+  DexMoveObject16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MoveObject16(int dest, int src) {
+  public DexMoveObject16(int dest, int src) {
     super(dest, src);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MoveObjectFrom16.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveObjectFrom16.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/MoveObjectFrom16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMoveObjectFrom16.java
index 8b32125..4016567 100644
--- a/src/main/java/com/android/tools/r8/code/MoveObjectFrom16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveObjectFrom16.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class MoveObjectFrom16 extends Format22x {
+
+public class DexMoveObjectFrom16 extends DexFormat22x {
 
   public static final int OPCODE = 0x8;
   public static final String NAME = "MoveObjectFrom16";
   public static final String SMALI_NAME = "move-object-from/16";
 
-  MoveObjectFrom16(int high, BytecodeStream stream) {
+  DexMoveObjectFrom16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MoveObjectFrom16(int dest, int src) {
+  public DexMoveObjectFrom16(int dest, int src) {
     super(dest, src);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MoveResult.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveResult.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/MoveResult.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMoveResult.java
index cd9eb78..caa3883 100644
--- a/src/main/java/com/android/tools/r8/code/MoveResult.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveResult.java
@@ -1,20 +1,21 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class MoveResult extends Format11x {
+
+public class DexMoveResult extends DexFormat11x {
 
   public static final int OPCODE = 0xa;
   public static final String NAME = "MoveResult";
   public static final String SMALI_NAME = "move-result";
 
-  /*package*/ MoveResult(int high, BytecodeStream stream) {
+  /*package*/ DexMoveResult(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MoveResult(int AA) {
+  public DexMoveResult(int AA) {
     super(AA);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MoveResultObject.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveResultObject.java
similarity index 78%
rename from src/main/java/com/android/tools/r8/code/MoveResultObject.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMoveResultObject.java
index 3210b71..d5248c7 100644
--- a/src/main/java/com/android/tools/r8/code/MoveResultObject.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveResultObject.java
@@ -1,21 +1,21 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MoveResultObject extends Format11x {
+public class DexMoveResultObject extends DexFormat11x {
 
   public static final int OPCODE = 0xc;
   public static final String NAME = "MoveResultObject";
   public static final String SMALI_NAME = "move-result-object";
 
-  /*package*/ MoveResultObject(int high, BytecodeStream stream) {
+  /*package*/ DexMoveResultObject(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MoveResultObject(int AA) {
+  public DexMoveResultObject(int AA) {
     super(AA);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MoveResultWide.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveResultWide.java
similarity index 79%
rename from src/main/java/com/android/tools/r8/code/MoveResultWide.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMoveResultWide.java
index 95b4350..6bff9b6 100644
--- a/src/main/java/com/android/tools/r8/code/MoveResultWide.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveResultWide.java
@@ -1,21 +1,21 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MoveResultWide extends Format11x {
+public class DexMoveResultWide extends DexFormat11x {
 
   public static final int OPCODE = 0xb;
   public static final String NAME = "MoveResultWide";
   public static final String SMALI_NAME = "move-result-wide";
 
-  /*package*/ MoveResultWide(int high, BytecodeStream stream) {
+  /*package*/ DexMoveResultWide(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MoveResultWide(int AA) {
+  public DexMoveResultWide(int AA) {
     super(AA);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MoveWide.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveWide.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/MoveWide.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMoveWide.java
index 06d44a2..88fe616 100644
--- a/src/main/java/com/android/tools/r8/code/MoveWide.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveWide.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MoveWide extends Format12x {
+public class DexMoveWide extends DexFormat12x {
 
   public static final int OPCODE = 0x4;
   public static final String NAME = "MoveWide";
   public static final String SMALI_NAME = "move-wide";
 
-  MoveWide(int high, BytecodeStream stream) {
+  DexMoveWide(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MoveWide(int dest, int src) {
+  public DexMoveWide(int dest, int src) {
     super(dest, src);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MoveWide16.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveWide16.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/MoveWide16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMoveWide16.java
index 66fe3fd..fd80875 100644
--- a/src/main/java/com/android/tools/r8/code/MoveWide16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveWide16.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MoveWide16 extends Format32x {
+public class DexMoveWide16 extends DexFormat32x {
 
   public static final int OPCODE = 0x6;
   public static final String NAME = "MoveWide16";
   public static final String SMALI_NAME = "move-wide/16";
 
-  MoveWide16(int high, BytecodeStream stream) {
+  DexMoveWide16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MoveWide16(int dest, int src) {
+  public DexMoveWide16(int dest, int src) {
     super(dest, src);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MoveWideFrom16.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveWideFrom16.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/MoveWideFrom16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMoveWideFrom16.java
index 45c3840..a3c4f6d 100644
--- a/src/main/java/com/android/tools/r8/code/MoveWideFrom16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveWideFrom16.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MoveWideFrom16 extends Format22x {
+public class DexMoveWideFrom16 extends DexFormat22x {
 
   public static final int OPCODE = 0x5;
   public static final String NAME = "MoveWideFrom16";
   public static final String SMALI_NAME = "move-wide-from/16";
 
-  MoveWideFrom16(int high, BytecodeStream stream) {
+  DexMoveWideFrom16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MoveWideFrom16(int dest, int src) {
+  public DexMoveWideFrom16(int dest, int src) {
     super(dest, src);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MulDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexMulDouble.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/code/MulDouble.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMulDouble.java
index 5c3f9df..1f195a0 100644
--- a/src/main/java/com/android/tools/r8/code/MulDouble.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMulDouble.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MulDouble extends Format23x {
+public class DexMulDouble extends DexFormat23x {
 
   public static final int OPCODE = 0xad;
   public static final String NAME = "MulDouble";
   public static final String SMALI_NAME = "mul-double";
 
-  MulDouble(int high, BytecodeStream stream) {
+  DexMulDouble(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MulDouble(int dest, int left, int right) {
+  public DexMulDouble(int dest, int left, int right) {
     super(dest, left, right);
     // The art x86 backend had a bug that made it fail on "mul r0, r1, r0" instructions where
     // the second src register and the dst register is the same (but the first src register is
diff --git a/src/main/java/com/android/tools/r8/code/MulDouble2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexMulDouble2Addr.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/MulDouble2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMulDouble2Addr.java
index 347ef3a..8290b14 100644
--- a/src/main/java/com/android/tools/r8/code/MulDouble2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMulDouble2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MulDouble2Addr extends Format12x {
+public class DexMulDouble2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xcd;
   public static final String NAME = "MulDouble2Addr";
   public static final String SMALI_NAME = "mul-double/2addr";
 
-  MulDouble2Addr(int high, BytecodeStream stream) {
+  DexMulDouble2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MulDouble2Addr(int left, int right) {
+  public DexMulDouble2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MulFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexMulFloat.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/code/MulFloat.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMulFloat.java
index 1792264..7155e5e 100644
--- a/src/main/java/com/android/tools/r8/code/MulFloat.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMulFloat.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MulFloat extends Format23x {
+public class DexMulFloat extends DexFormat23x {
 
   public static final int OPCODE = 0xa8;
   public static final String NAME = "MulFloat";
   public static final String SMALI_NAME = "mul-float";
 
-  MulFloat(int high, BytecodeStream stream) {
+  DexMulFloat(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MulFloat(int dest, int left, int right) {
+  public DexMulFloat(int dest, int left, int right) {
     super(dest, left, right);
     // The art x86 backend had a bug that made it fail on "mul r0, r1, r0" instructions where
     // the second src register and the dst register is the same (but the first src register is
diff --git a/src/main/java/com/android/tools/r8/code/MulFloat2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexMulFloat2Addr.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/MulFloat2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMulFloat2Addr.java
index 1e56be6..0147cac 100644
--- a/src/main/java/com/android/tools/r8/code/MulFloat2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMulFloat2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MulFloat2Addr extends Format12x {
+public class DexMulFloat2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xc8;
   public static final String NAME = "MulFloat2Addr";
   public static final String SMALI_NAME = "mul-float/2addr";
 
-  MulFloat2Addr(int high, BytecodeStream stream) {
+  DexMulFloat2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MulFloat2Addr(int left, int right) {
+  public DexMulFloat2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MulInt.java b/src/main/java/com/android/tools/r8/dex/code/DexMulInt.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/code/MulInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMulInt.java
index 2513ab9..12c5ed9 100644
--- a/src/main/java/com/android/tools/r8/code/MulInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMulInt.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class MulInt extends Format23x {
+
+public class DexMulInt extends DexFormat23x {
 
   public static final int OPCODE = 0x92;
   public static final String NAME = "MulInt";
   public static final String SMALI_NAME = "mul-int";
 
-  MulInt(int high, BytecodeStream stream) {
+  DexMulInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MulInt(int dest, int left, int right) {
+  public DexMulInt(int dest, int left, int right) {
     super(dest, left, right);
     // The art x86 backend had a bug that made it fail on "mul r0, r1, r0" instructions where
     // the second src register and the dst register is the same (but the first src register is
diff --git a/src/main/java/com/android/tools/r8/code/MulInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexMulInt2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/MulInt2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMulInt2Addr.java
index e65146a..d0fda45 100644
--- a/src/main/java/com/android/tools/r8/code/MulInt2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMulInt2Addr.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class MulInt2Addr extends Format12x {
+
+public class DexMulInt2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xb2;
   public static final String NAME = "MulInt2Addr";
   public static final String SMALI_NAME = "mul-int/2addr";
 
-  MulInt2Addr(int high, BytecodeStream stream) {
+  DexMulInt2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MulInt2Addr(int left, int right) {
+  public DexMulInt2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MulIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexMulIntLit16.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/MulIntLit16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMulIntLit16.java
index efa2cfb..ba7acd0 100644
--- a/src/main/java/com/android/tools/r8/code/MulIntLit16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMulIntLit16.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MulIntLit16 extends Format22s {
+public class DexMulIntLit16 extends DexFormat22s {
 
   public static final int OPCODE = 0xd2;
   public static final String NAME = "MulIntLit16";
   public static final String SMALI_NAME = "mul-int/lit16";
 
-  MulIntLit16(int high, BytecodeStream stream) {
+  DexMulIntLit16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MulIntLit16(int dest, int register, int constant) {
+  public DexMulIntLit16(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MulIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexMulIntLit8.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/MulIntLit8.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMulIntLit8.java
index 0de1c6f..0173322 100644
--- a/src/main/java/com/android/tools/r8/code/MulIntLit8.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMulIntLit8.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MulIntLit8 extends Format22b {
+public class DexMulIntLit8 extends DexFormat22b {
 
   public static final int OPCODE = 0xda;
   public static final String NAME = "MulIntLit8";
   public static final String SMALI_NAME = "mul-int/lit8";
 
-  MulIntLit8(int high, BytecodeStream stream) {
+  DexMulIntLit8(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MulIntLit8(int dest, int register, int constant) {
+  public DexMulIntLit8(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/MulLong.java b/src/main/java/com/android/tools/r8/dex/code/DexMulLong.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/code/MulLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMulLong.java
index 486b4d6..d545bec 100644
--- a/src/main/java/com/android/tools/r8/code/MulLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMulLong.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MulLong extends Format23x {
+public class DexMulLong extends DexFormat23x {
 
   public static final int OPCODE = 0x9d;
   public static final String NAME = "MulLong";
   public static final String SMALI_NAME = "mul-long";
 
-  MulLong(int high, BytecodeStream stream) {
+  DexMulLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MulLong(int dest, int left, int right) {
+  public DexMulLong(int dest, int left, int right) {
     super(dest, left, right);
     // The art x86 backend had a bug that made it fail on "mul r0, r1, r0" instructions where
     // the second src register and the dst register is the same (but the first src register is
diff --git a/src/main/java/com/android/tools/r8/code/MulLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexMulLong2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/MulLong2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexMulLong2Addr.java
index 2cd78f6..ae0c5cf 100644
--- a/src/main/java/com/android/tools/r8/code/MulLong2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexMulLong2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class MulLong2Addr extends Format12x {
+public class DexMulLong2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xbd;
   public static final String NAME = "MulLong2Addr";
   public static final String SMALI_NAME = "mul-long/2addr";
 
-  MulLong2Addr(int high, BytecodeStream stream) {
+  DexMulLong2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public MulLong2Addr(int left, int right) {
+  public DexMulLong2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/NegDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexNegDouble.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/NegDouble.java
rename to src/main/java/com/android/tools/r8/dex/code/DexNegDouble.java
index bd054aa..64c6dcd 100644
--- a/src/main/java/com/android/tools/r8/code/NegDouble.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNegDouble.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class NegDouble extends Format12x {
+
+public class DexNegDouble extends DexFormat12x {
 
   public static final int OPCODE = 0x80;
   public static final String NAME = "NegDouble";
   public static final String SMALI_NAME = "neg-double";
 
-  /*package*/ NegDouble(int high, BytecodeStream stream) {
+  /*package*/ DexNegDouble(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public NegDouble(int dest, int source) {
+  public DexNegDouble(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/NegFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexNegFloat.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/NegFloat.java
rename to src/main/java/com/android/tools/r8/dex/code/DexNegFloat.java
index 54d3053..58d214c 100644
--- a/src/main/java/com/android/tools/r8/code/NegFloat.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNegFloat.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class NegFloat extends Format12x {
+public class DexNegFloat extends DexFormat12x {
 
   public static final int OPCODE = 0x7f;
   public static final String NAME = "NegFloat";
   public static final String SMALI_NAME = "neg-float";
 
-  /*package*/ NegFloat(int high, BytecodeStream stream) {
+  /*package*/ DexNegFloat(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public NegFloat(int dest, int source) {
+  public DexNegFloat(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/NegInt.java b/src/main/java/com/android/tools/r8/dex/code/DexNegInt.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/NegInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexNegInt.java
index 82e7b86..fda8099 100644
--- a/src/main/java/com/android/tools/r8/code/NegInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNegInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class NegInt extends Format12x {
+public class DexNegInt extends DexFormat12x {
 
   public static final int OPCODE = 0x7b;
   public static final String NAME = "NegInt";
   public static final String SMALI_NAME = "neg-int";
 
-  /*package*/ NegInt(int high, BytecodeStream stream) {
+  /*package*/ DexNegInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public NegInt(int dest, int source) {
+  public DexNegInt(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/NegLong.java b/src/main/java/com/android/tools/r8/dex/code/DexNegLong.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/NegLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexNegLong.java
index 3b2a304..43a8780 100644
--- a/src/main/java/com/android/tools/r8/code/NegLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNegLong.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class NegLong extends Format12x {
+
+public class DexNegLong extends DexFormat12x {
 
   public static final int OPCODE = 0x7d;
   public static final String NAME = "NegLong";
   public static final String SMALI_NAME = "neg-long";
 
-  /*package*/ NegLong(int high, BytecodeStream stream) {
+  /*package*/ DexNegLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public NegLong(int dest, int source) {
+  public DexNegLong(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/NewArray.java b/src/main/java/com/android/tools/r8/dex/code/DexNewArray.java
similarity index 89%
rename from src/main/java/com/android/tools/r8/code/NewArray.java
rename to src/main/java/com/android/tools/r8/dex/code/DexNewArray.java
index 35b3187..70fba01 100644
--- a/src/main/java/com/android/tools/r8/code/NewArray.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNewArray.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.DexType;
@@ -14,17 +14,17 @@
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
 import java.nio.ShortBuffer;
 
-public class NewArray extends Format22c<DexType> {
+public class DexNewArray extends DexFormat22c<DexType> {
 
   public static final int OPCODE = 0x23;
   public static final String NAME = "NewArray";
   public static final String SMALI_NAME = "new-array";
 
-  /*package*/ NewArray(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexNewArray(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getTypeMap());
   }
 
-  public NewArray(int dest, int size, DexType type) {
+  public DexNewArray(int dest, int size, DexType type) {
     super(dest, size, type);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/NewInstance.java b/src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java
similarity index 87%
rename from src/main/java/com/android/tools/r8/code/NewInstance.java
rename to src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java
index 1aed86e..4867c22 100644
--- a/src/main/java/com/android/tools/r8/code/NewInstance.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.DexType;
@@ -15,17 +15,17 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-public class NewInstance extends Format21c<DexType> {
+public class DexNewInstance extends DexFormat21c<DexType> {
 
   public static final int OPCODE = 0x22;
   public static final String NAME = "NewInstance";
   public static final String SMALI_NAME = "new-instance";
 
-  NewInstance(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexNewInstance(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getTypeMap());
   }
 
-  public NewInstance(int AA, DexType BBBB) {
+  public DexNewInstance(int AA, DexType BBBB) {
     super(AA, BBBB);
   }
 
@@ -45,7 +45,7 @@
   }
 
   @Override
-  void internalSubSpecify(StructuralSpecification<Format21c<DexType>, ?> spec) {
+  void internalSubSpecify(StructuralSpecification<DexFormat21c<DexType>, ?> spec) {
     spec.withItem(i -> i.BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/DexNewUnboxedEnumInstance.java b/src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java
similarity index 91%
rename from src/main/java/com/android/tools/r8/code/DexNewUnboxedEnumInstance.java
rename to src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java
index 9909ac6..235aaca 100644
--- a/src/main/java/com/android/tools/r8/code/DexNewUnboxedEnumInstance.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.errors.Unreachable;
@@ -16,7 +16,7 @@
 import java.nio.ShortBuffer;
 
 /** The dex representation of {@link com.android.tools.r8.ir.code.NewUnboxedEnumInstance}. */
-public class DexNewUnboxedEnumInstance extends Format21c<DexType> {
+public class DexNewUnboxedEnumInstance extends DexFormat21c<DexType> {
 
   public static final int OPCODE = 0x22;
   public static final String NAME = "NewUnboxedEnumInstance";
@@ -45,7 +45,7 @@
   }
 
   @Override
-  void internalSubSpecify(StructuralSpecification<Format21c<DexType>, ?> spec) {
+  void internalSubSpecify(StructuralSpecification<DexFormat21c<DexType>, ?> spec) {
     spec.withItem(i -> i.BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/Nop.java b/src/main/java/com/android/tools/r8/dex/code/DexNop.java
similarity index 71%
rename from src/main/java/com/android/tools/r8/code/Nop.java
rename to src/main/java/com/android/tools/r8/dex/code/DexNop.java
index 1e46cfc..f25e0ec 100644
--- a/src/main/java/com/android/tools/r8/code/Nop.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNop.java
@@ -1,40 +1,39 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 
-public class Nop extends Format10x {
+public class DexNop extends DexFormat10x {
 
   public static final int OPCODE = 0x0;
   public static final String NAME = "Nop";
   public static final String SMALI_NAME = "nop";
 
-  Nop(int high, BytecodeStream stream) {
+  DexNop(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public Nop() {
-  }
+  public DexNop() {}
 
-  public static Nop create(int high, BytecodeStream stream) {
+  public static DexNop create(int high, BytecodeStream stream) {
     switch (high) {
       case 0x01:
-        return new PackedSwitchPayload(high, stream);
+        return new DexPackedSwitchPayload(high, stream);
       case 0x02:
-        return new SparseSwitchPayload(high, stream);
+        return new DexSparseSwitchPayload(high, stream);
       case 0x03:
-        return new FillArrayDataPayload(high, stream);
+        return new DexFillArrayDataPayload(high, stream);
       default:
-        return new Nop(high, stream);
+        return new DexNop(high, stream);
     }
   }
 
   // Notice that this must be overridden by the "Nop" subtypes!
   @Override
-  int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
+  int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
     return DexCompareHelper.compareIdUniquelyDeterminesEquality(this, other);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/NotInt.java b/src/main/java/com/android/tools/r8/dex/code/DexNotInt.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/NotInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexNotInt.java
index c9681a7..0dde493 100644
--- a/src/main/java/com/android/tools/r8/code/NotInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNotInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class NotInt extends Format12x {
+public class DexNotInt extends DexFormat12x {
 
   public static final int OPCODE = 0x7c;
   public static final String NAME = "NotInt";
   public static final String SMALI_NAME = "not-int";
 
-  NotInt(int high, BytecodeStream stream) {
+  DexNotInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public NotInt(int dest, int source) {
+  public DexNotInt(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/NotLong.java b/src/main/java/com/android/tools/r8/dex/code/DexNotLong.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/NotLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexNotLong.java
index fcbf475..ec5af4d 100644
--- a/src/main/java/com/android/tools/r8/code/NotLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexNotLong.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class NotLong extends Format12x {
+
+public class DexNotLong extends DexFormat12x {
 
   public static final int OPCODE = 0x7e;
   public static final String NAME = "NotLong";
   public static final String SMALI_NAME = "not-long";
 
-  NotLong(int high, BytecodeStream stream) {
+  DexNotLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public NotLong(int dest, int source) {
+  public DexNotLong(int dest, int source) {
     super(dest, source);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/OrInt.java b/src/main/java/com/android/tools/r8/dex/code/DexOrInt.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/OrInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexOrInt.java
index b7aeba4..61be0ac 100644
--- a/src/main/java/com/android/tools/r8/code/OrInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexOrInt.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class OrInt extends Format23x {
+
+public class DexOrInt extends DexFormat23x {
 
   public static final int OPCODE = 0x96;
   public static final String NAME = "OrInt";
   public static final String SMALI_NAME = "or-int";
 
-  OrInt(int high, BytecodeStream stream) {
+  DexOrInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public OrInt(int dest, int left, int right) {
+  public DexOrInt(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/OrInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexOrInt2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/OrInt2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexOrInt2Addr.java
index 869be4d..a152de8 100644
--- a/src/main/java/com/android/tools/r8/code/OrInt2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexOrInt2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class OrInt2Addr extends Format12x {
+public class DexOrInt2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xb6;
   public static final String NAME = "OrInt2Addr";
   public static final String SMALI_NAME = "or-int/2addr";
 
-  OrInt2Addr(int high, BytecodeStream stream) {
+  DexOrInt2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public OrInt2Addr(int left, int right) {
+  public DexOrInt2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/OrIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexOrIntLit16.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/OrIntLit16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexOrIntLit16.java
index 73e384d..9d3f245 100644
--- a/src/main/java/com/android/tools/r8/code/OrIntLit16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexOrIntLit16.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class OrIntLit16 extends Format22s {
+public class DexOrIntLit16 extends DexFormat22s {
 
   public static final int OPCODE = 0xd6;
   public static final String NAME = "OrIntLit16";
   public static final String SMALI_NAME = "or-int/lit16";
 
-  OrIntLit16(int high, BytecodeStream stream) {
+  DexOrIntLit16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public OrIntLit16(int dest, int register, int constant) {
+  public DexOrIntLit16(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/OrIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexOrIntLit8.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/OrIntLit8.java
rename to src/main/java/com/android/tools/r8/dex/code/DexOrIntLit8.java
index 8c37e7b..4810953 100644
--- a/src/main/java/com/android/tools/r8/code/OrIntLit8.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexOrIntLit8.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class OrIntLit8 extends Format22b {
+public class DexOrIntLit8 extends DexFormat22b {
 
   public static final int OPCODE = 0xde;
   public static final String NAME = "OrIntLit8";
   public static final String SMALI_NAME = "or-int/lit8";
 
-  OrIntLit8(int high, BytecodeStream stream) {
+  DexOrIntLit8(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public OrIntLit8(int dest, int register, int constant) {
+  public DexOrIntLit8(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/OrLong.java b/src/main/java/com/android/tools/r8/dex/code/DexOrLong.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/OrLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexOrLong.java
index 0cef69b..02c9f52 100644
--- a/src/main/java/com/android/tools/r8/code/OrLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexOrLong.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class OrLong extends Format23x {
+
+public class DexOrLong extends DexFormat23x {
 
   public static final int OPCODE = 0xA1;
   public static final String NAME = "OrLong";
   public static final String SMALI_NAME = "or-long";
 
-  OrLong(int high, BytecodeStream stream) {
+  DexOrLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public OrLong(int dest, int left, int right) {
+  public DexOrLong(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/OrLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexOrLong2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/OrLong2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexOrLong2Addr.java
index 175a4a7..5fffef9 100644
--- a/src/main/java/com/android/tools/r8/code/OrLong2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexOrLong2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class OrLong2Addr extends Format12x {
+public class DexOrLong2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xc1;
   public static final String NAME = "OrLong2Addr";
   public static final String SMALI_NAME = "or-long/2addr";
 
-  OrLong2Addr(int high, BytecodeStream stream) {
+  DexOrLong2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public OrLong2Addr(int left, int right) {
+  public DexOrLong2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/PackedSwitch.java b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitch.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/code/PackedSwitch.java
rename to src/main/java/com/android/tools/r8/dex/code/DexPackedSwitch.java
index 070b870..34029d8 100644
--- a/src/main/java/com/android/tools/r8/code/PackedSwitch.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitch.java
@@ -2,22 +2,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.naming.ClassNameMapper;
 
-public class PackedSwitch extends Format31t {
+public class DexPackedSwitch extends DexFormat31t {
 
   public static final int OPCODE = 0x2b;
   public static final String NAME = "PackedSwitch";
   public static final String SMALI_NAME = "packed-switch";
 
-  PackedSwitch(int high, BytecodeStream stream) {
+  DexPackedSwitch(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public PackedSwitch(int valueRegister) {
+  public DexPackedSwitch(int valueRegister) {
     super(valueRegister, -1);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/PackedSwitchPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/PackedSwitchPayload.java
rename to src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java
index 3d297bb..2b0a21f 100644
--- a/src/main/java/com/android/tools/r8/code/PackedSwitchPayload.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
@@ -14,17 +14,17 @@
 import java.nio.ShortBuffer;
 import java.util.Arrays;
 
-public class PackedSwitchPayload extends SwitchPayload {
+public class DexPackedSwitchPayload extends DexSwitchPayload {
 
   public final int size;
   public final int first_key;
   public final /* offset */ int[] targets;
 
-  private static void specify(StructuralSpecification<PackedSwitchPayload, ?> spec) {
+  private static void specify(StructuralSpecification<DexPackedSwitchPayload, ?> spec) {
     spec.withInt(i -> i.size).withInt(i -> i.first_key).withIntArray(i -> i.targets);
   }
 
-  public PackedSwitchPayload(int high, BytecodeStream stream) {
+  public DexPackedSwitchPayload(int high, BytecodeStream stream) {
     super(high, stream);
     size = read16BitValue(stream);
     first_key = readSigned32BitValue(stream);
@@ -34,8 +34,8 @@
     }
   }
 
-  public PackedSwitchPayload(int first_key, int[] targets) {
-    assert targets.length > 0;  // Empty switches should be eliminated.
+  public DexPackedSwitchPayload(int first_key, int[] targets) {
+    assert targets.length > 0; // Empty switches should be eliminated.
     this.size = targets.length;
     this.first_key = first_key;
     this.targets = targets;
@@ -53,7 +53,7 @@
       GraphLens graphLens,
       ObjectToOffsetMapping mapping,
       LensCodeRewriterUtils rewriter) {
-    writeFirst(1, dest);  // Pseudo-opcode = 0x0100
+    writeFirst(1, dest); // Pseudo-opcode = 0x0100
     write16BitValue(size, dest);
     write32BitValue(first_key, dest);
     for (int i = 0; i < size; i++) {
@@ -62,8 +62,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (PackedSwitchPayload) other, PackedSwitchPayload::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexPackedSwitchPayload) other, DexPackedSwitchPayload::specify);
   }
 
   @Override
@@ -92,7 +92,7 @@
 
   @Override
   public int[] keys() {
-    return new int[]{first_key};
+    return new int[] {first_key};
   }
 
   @Override
@@ -101,7 +101,7 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming, Instruction payloadUser) {
+  public String toString(ClassNameMapper naming, DexInstruction payloadUser) {
     StringBuilder builder = new StringBuilder("[PackedSwitchPayload");
     if (payloadUser == null) {
       builder.append(" offsets relative to associated PackedSwitch");
@@ -121,7 +121,7 @@
   }
 
   @Override
-  public String toSmaliString(Instruction payloadUser) {
+  public String toSmaliString(DexInstruction payloadUser) {
     StringBuilder builder = new StringBuilder();
     builder.append("    ");
     builder.append(".packed-switch ");
diff --git a/src/main/java/com/android/tools/r8/code/DexRecordFieldValues.java b/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java
similarity index 93%
rename from src/main/java/com/android/tools/r8/code/DexRecordFieldValues.java
rename to src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java
index 13cde75..14e564b 100644
--- a/src/main/java/com/android/tools/r8/code/DexRecordFieldValues.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java
@@ -1,7 +1,7 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.errors.Unreachable;
@@ -20,7 +20,7 @@
 import java.nio.ShortBuffer;
 import java.util.Arrays;
 
-public class DexRecordFieldValues extends Instruction {
+public class DexRecordFieldValues extends DexInstruction {
 
   public static final String NAME = "RecordFieldValues";
   public static final String SMALI_NAME = "record-field-values*";
@@ -73,7 +73,7 @@
   }
 
   @Override
-  int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
+  int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
     return visitor.visit(this, (DexRecordFieldValues) other, DexRecordFieldValues::specify);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/RemDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexRemDouble.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/RemDouble.java
rename to src/main/java/com/android/tools/r8/dex/code/DexRemDouble.java
index 4107bf0..8ca18cb 100644
--- a/src/main/java/com/android/tools/r8/code/RemDouble.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRemDouble.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class RemDouble extends Format23x {
+public class DexRemDouble extends DexFormat23x {
 
   public static final int OPCODE = 0xaf;
   public static final String NAME = "RemDouble";
   public static final String SMALI_NAME = "rem-double";
 
-  RemDouble(int high, BytecodeStream stream) {
+  DexRemDouble(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public RemDouble(int dest, int left, int right) {
+  public DexRemDouble(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/RemDouble2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexRemDouble2Addr.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/RemDouble2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexRemDouble2Addr.java
index a538dfd..022087a 100644
--- a/src/main/java/com/android/tools/r8/code/RemDouble2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRemDouble2Addr.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class RemDouble2Addr extends Format12x {
+
+public class DexRemDouble2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xcf;
   public static final String NAME = "RemDouble2Addr";
   public static final String SMALI_NAME = "rem-double/2addr";
 
-  RemDouble2Addr(int high, BytecodeStream stream) {
+  DexRemDouble2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public RemDouble2Addr(int left, int right) {
+  public DexRemDouble2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/RemFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexRemFloat.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/RemFloat.java
rename to src/main/java/com/android/tools/r8/dex/code/DexRemFloat.java
index 944332b..ac5984b 100644
--- a/src/main/java/com/android/tools/r8/code/RemFloat.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRemFloat.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class RemFloat extends Format23x {
+
+public class DexRemFloat extends DexFormat23x {
 
   public static final int OPCODE = 0xaA;
   public static final String NAME = "RemFloat";
   public static final String SMALI_NAME = "rem-float";
 
-  RemFloat(int high, BytecodeStream stream) {
+  DexRemFloat(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public RemFloat(int dest, int left, int right) {
+  public DexRemFloat(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/RemFloat2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexRemFloat2Addr.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/RemFloat2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexRemFloat2Addr.java
index ddfdb15..fcad4b1 100644
--- a/src/main/java/com/android/tools/r8/code/RemFloat2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRemFloat2Addr.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class RemFloat2Addr extends Format12x {
+
+public class DexRemFloat2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xca;
   public static final String NAME = "RemFloat2Addr";
   public static final String SMALI_NAME = "rem-float/2addr";
 
-  RemFloat2Addr(int high, BytecodeStream stream) {
+  DexRemFloat2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public RemFloat2Addr(int left, int right) {
+  public DexRemFloat2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/RemInt.java b/src/main/java/com/android/tools/r8/dex/code/DexRemInt.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/RemInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexRemInt.java
index f345fc6..3b6850e 100644
--- a/src/main/java/com/android/tools/r8/code/RemInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRemInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class RemInt extends Format23x {
+public class DexRemInt extends DexFormat23x {
 
   public static final int OPCODE = 0x94;
   public static final String NAME = "RemInt";
   public static final String SMALI_NAME = "rem-int";
 
-  RemInt(int high, BytecodeStream stream) {
+  DexRemInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public RemInt(int dest, int left, int right) {
+  public DexRemInt(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/RemInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexRemInt2Addr.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/RemInt2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexRemInt2Addr.java
index 5e357d6..f1d1d8d 100644
--- a/src/main/java/com/android/tools/r8/code/RemInt2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRemInt2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class RemInt2Addr extends Format12x {
+public class DexRemInt2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xb4;
   public static final String NAME = "RemInt2Addr";
   public static final String SMALI_NAME = "rem-int/2addr";
 
-  RemInt2Addr(int high, BytecodeStream stream) {
+  DexRemInt2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public RemInt2Addr(int left, int right) {
+  public DexRemInt2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/RemIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexRemIntLit16.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/RemIntLit16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexRemIntLit16.java
index 80f3277..630b564 100644
--- a/src/main/java/com/android/tools/r8/code/RemIntLit16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRemIntLit16.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class RemIntLit16 extends Format22s {
+public class DexRemIntLit16 extends DexFormat22s {
 
   public static final int OPCODE = 0xd4;
   public static final String NAME = "RemIntLit16";
   public static final String SMALI_NAME = "rem-int/lit16";
 
-  RemIntLit16(int high, BytecodeStream stream) {
+  DexRemIntLit16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public RemIntLit16(int dest, int register, int constant) {
+  public DexRemIntLit16(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/RemIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexRemIntLit8.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/RemIntLit8.java
rename to src/main/java/com/android/tools/r8/dex/code/DexRemIntLit8.java
index d1fcc7f..15ec213 100644
--- a/src/main/java/com/android/tools/r8/code/RemIntLit8.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRemIntLit8.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class RemIntLit8 extends Format22b {
+
+public class DexRemIntLit8 extends DexFormat22b {
 
   public static final int OPCODE = 0xdc;
   public static final String NAME = "RemIntLit8";
   public static final String SMALI_NAME = "rem-int/lit8";
 
-  RemIntLit8(int high, BytecodeStream stream) {
+  DexRemIntLit8(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public RemIntLit8(int dest, int register, int constant) {
+  public DexRemIntLit8(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/RemLong.java b/src/main/java/com/android/tools/r8/dex/code/DexRemLong.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/RemLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexRemLong.java
index fa48d0c..46f1278 100644
--- a/src/main/java/com/android/tools/r8/code/RemLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRemLong.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class RemLong extends Format23x {
+public class DexRemLong extends DexFormat23x {
 
   public static final int OPCODE = 0x9f;
   public static final String NAME = "RemLong";
   public static final String SMALI_NAME = "rem-long";
 
-  RemLong(int high, BytecodeStream stream) {
+  DexRemLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public RemLong(int dest, int left, int right) {
+  public DexRemLong(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/RemLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexRemLong2Addr.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/RemLong2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexRemLong2Addr.java
index ec14f4f..dcf2dc3 100644
--- a/src/main/java/com/android/tools/r8/code/RemLong2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRemLong2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class RemLong2Addr extends Format12x {
+public class DexRemLong2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xbf;
   public static final String NAME = "RemLong2Addr";
   public static final String SMALI_NAME = "rem-long/2addr";
 
-  RemLong2Addr(int high, BytecodeStream stream) {
+  DexRemLong2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public RemLong2Addr(int left, int right) {
+  public DexRemLong2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/Return.java b/src/main/java/com/android/tools/r8/dex/code/DexReturn.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/Return.java
rename to src/main/java/com/android/tools/r8/dex/code/DexReturn.java
index 6792c3a..2d3662d 100644
--- a/src/main/java/com/android/tools/r8/code/Return.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexReturn.java
@@ -1,21 +1,21 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class Return extends Format11x {
+public class DexReturn extends DexFormat11x {
 
   public static final int OPCODE = 0xf;
   public static final String NAME = "Return";
   public static final String SMALI_NAME = "return";
 
-  Return(int high, BytecodeStream stream) {
+  DexReturn(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public Return(int AA) {
+  public DexReturn(int AA) {
     super(AA);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ReturnObject.java b/src/main/java/com/android/tools/r8/dex/code/DexReturnObject.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/ReturnObject.java
rename to src/main/java/com/android/tools/r8/dex/code/DexReturnObject.java
index c5008c7..07a795d 100644
--- a/src/main/java/com/android/tools/r8/code/ReturnObject.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexReturnObject.java
@@ -1,21 +1,21 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class ReturnObject extends Format11x {
+public class DexReturnObject extends DexFormat11x {
 
   public static final int OPCODE = 0x11;
   public static final String NAME = "ReturnObject";
   public static final String SMALI_NAME = "return-object";
 
-  ReturnObject(int high, BytecodeStream stream) {
+  DexReturnObject(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ReturnObject(int AA) {
+  public DexReturnObject(int AA) {
     super(AA);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ReturnVoid.java b/src/main/java/com/android/tools/r8/dex/code/DexReturnVoid.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/ReturnVoid.java
rename to src/main/java/com/android/tools/r8/dex/code/DexReturnVoid.java
index 32d75f8..fae79fc 100644
--- a/src/main/java/com/android/tools/r8/code/ReturnVoid.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexReturnVoid.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 
-public class ReturnVoid extends Format10x {
+public class DexReturnVoid extends DexFormat10x {
 
   public static final int OPCODE = 0xe;
   public static final String NAME = "ReturnVoid";
   public static final String SMALI_NAME = "return-void";
 
-  ReturnVoid(int high, BytecodeStream stream) {
+  DexReturnVoid(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ReturnVoid() {}
+  public DexReturnVoid() {}
 
   @Override
   public String getName() {
@@ -34,7 +34,7 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
     return DexCompareHelper.compareIdUniquelyDeterminesEquality(this, other);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ReturnWide.java b/src/main/java/com/android/tools/r8/dex/code/DexReturnWide.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/ReturnWide.java
rename to src/main/java/com/android/tools/r8/dex/code/DexReturnWide.java
index f1f40b2..c3670f0 100644
--- a/src/main/java/com/android/tools/r8/code/ReturnWide.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexReturnWide.java
@@ -1,21 +1,21 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class ReturnWide extends Format11x {
+public class DexReturnWide extends DexFormat11x {
 
   public static final int OPCODE = 0x10;
   public static final String NAME = "ReturnWide";
   public static final String SMALI_NAME = "return-wide";
 
-  ReturnWide(int high, BytecodeStream stream) {
+  DexReturnWide(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ReturnWide(int AA) {
+  public DexReturnWide(int AA) {
     super(AA);
   }
 
@@ -43,4 +43,4 @@
   public void buildIR(IRBuilder builder) {
     builder.addReturn(AA);
   }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/android/tools/r8/code/RsubInt.java b/src/main/java/com/android/tools/r8/dex/code/DexRsubInt.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/RsubInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexRsubInt.java
index 410f81a..7a2d7bd 100644
--- a/src/main/java/com/android/tools/r8/code/RsubInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRsubInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class RsubInt extends Format22s {
+public class DexRsubInt extends DexFormat22s {
 
   public static final int OPCODE = 0xd1;
   public static final String NAME = "RsubInt";
   public static final String SMALI_NAME = "rsub-int";
 
-  RsubInt(int high, BytecodeStream stream) {
+  DexRsubInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public RsubInt(int dest, int register, int constant) {
+  public DexRsubInt(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/RsubIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexRsubIntLit8.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/RsubIntLit8.java
rename to src/main/java/com/android/tools/r8/dex/code/DexRsubIntLit8.java
index 242a3ba..8ea9a48 100644
--- a/src/main/java/com/android/tools/r8/code/RsubIntLit8.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRsubIntLit8.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class RsubIntLit8 extends Format22b {
+
+public class DexRsubIntLit8 extends DexFormat22b {
 
   public static final int OPCODE = 0xd9;
   public static final String NAME = "RsubIntLit8";
   public static final String SMALI_NAME = "rsub-int/lit8";
 
-  RsubIntLit8(int high, BytecodeStream stream) {
+  DexRsubIntLit8(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public RsubIntLit8(int dest, int register, int constant) {
+  public DexRsubIntLit8(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SafeCheckCast.java b/src/main/java/com/android/tools/r8/dex/code/DexSafeCheckCast.java
similarity index 68%
rename from src/main/java/com/android/tools/r8/code/SafeCheckCast.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSafeCheckCast.java
index 8f19396..004708b 100644
--- a/src/main/java/com/android/tools/r8/code/SafeCheckCast.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSafeCheckCast.java
@@ -1,21 +1,21 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SafeCheckCast extends CheckCast {
+public class DexSafeCheckCast extends DexCheckCast {
 
-  SafeCheckCast(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexSafeCheckCast(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping);
   }
 
-  public SafeCheckCast(int valueRegister, DexType type) {
+  public DexSafeCheckCast(int valueRegister, DexType type) {
     super(valueRegister, type, true);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/Sget.java b/src/main/java/com/android/tools/r8/dex/code/DexSget.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/Sget.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSget.java
index 2bd4653..91bfbd9 100644
--- a/src/main/java/com/android/tools/r8/code/Sget.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSget.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class Sget extends SgetOrSput implements CfOrDexStaticFieldRead {
+public class DexSget extends DexSgetOrSput implements CfOrDexStaticFieldRead {
 
   public static final int OPCODE = 0x60;
   public static final String NAME = "Sget";
   public static final String SMALI_NAME = "sget";
 
-  Sget(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexSget(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public Sget(int AA, DexField BBBB) {
+  public DexSget(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SgetBoolean.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetBoolean.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/SgetBoolean.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSgetBoolean.java
index fb51776..1f669e0 100644
--- a/src/main/java/com/android/tools/r8/code/SgetBoolean.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetBoolean.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SgetBoolean extends SgetOrSput implements CfOrDexStaticFieldRead {
+public class DexSgetBoolean extends DexSgetOrSput implements CfOrDexStaticFieldRead {
 
   public static final int OPCODE = 0x63;
   public static final String NAME = "SgetBoolean";
   public static final String SMALI_NAME = "sget-boolean";
 
-  SgetBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexSgetBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public SgetBoolean(int AA, DexField BBBB) {
+  public DexSgetBoolean(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SgetByte.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetByte.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/SgetByte.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSgetByte.java
index ee693ac..ace5c84 100644
--- a/src/main/java/com/android/tools/r8/code/SgetByte.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetByte.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SgetByte extends SgetOrSput implements CfOrDexStaticFieldRead {
+public class DexSgetByte extends DexSgetOrSput implements CfOrDexStaticFieldRead {
 
   public static final int OPCODE = 0x64;
   public static final String NAME = "SgetByte";
   public static final String SMALI_NAME = "sget-byte";
 
-  SgetByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexSgetByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public SgetByte(int AA, DexField BBBB) {
+  public DexSgetByte(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SgetChar.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetChar.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/SgetChar.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSgetChar.java
index 5f61f90..4219043 100644
--- a/src/main/java/com/android/tools/r8/code/SgetChar.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetChar.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SgetChar extends SgetOrSput implements CfOrDexStaticFieldRead {
+public class DexSgetChar extends DexSgetOrSput implements CfOrDexStaticFieldRead {
 
   public static final int OPCODE = 0x65;
   public static final String NAME = "SgetChar";
   public static final String SMALI_NAME = "sget-char";
 
-  SgetChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexSgetChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public SgetChar(int AA, DexField BBBB) {
+  public DexSgetChar(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SgetObject.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetObject.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/SgetObject.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSgetObject.java
index 8e5018e..7894adf 100644
--- a/src/main/java/com/android/tools/r8/code/SgetObject.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetObject.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SgetObject extends SgetOrSput implements CfOrDexStaticFieldRead {
+public class DexSgetObject extends DexSgetOrSput implements CfOrDexStaticFieldRead {
 
   public static final int OPCODE = 0x62;
   public static final String NAME = "SgetObject";
   public static final String SMALI_NAME = "sget-object";
 
-  SgetObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexSgetObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public SgetObject(int AA, DexField BBBB) {
+  public DexSgetObject(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SgetOrSput.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/SgetOrSput.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java
index 499d679..959659c 100644
--- a/src/main/java/com/android/tools/r8/code/SgetOrSput.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.graph.DexField;
@@ -12,13 +12,13 @@
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
-abstract class SgetOrSput extends Format21c<DexField> {
+abstract class DexSgetOrSput extends DexFormat21c<DexField> {
 
-  SgetOrSput(int high, BytecodeStream stream, DexField[] map) {
+  DexSgetOrSput(int high, BytecodeStream stream, DexField[] map) {
     super(high, stream, map);
   }
 
-  protected SgetOrSput(int AA, DexField BBBB) {
+  protected DexSgetOrSput(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
@@ -50,7 +50,7 @@
   }
 
   @Override
-  void internalSubSpecify(StructuralSpecification<Format21c<DexField>, ?> spec) {
+  void internalSubSpecify(StructuralSpecification<DexFormat21c<DexField>, ?> spec) {
     spec.withItem(i -> i.BBBB);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/code/SgetShort.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetShort.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/SgetShort.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSgetShort.java
index 99fc4ee..b98797d 100644
--- a/src/main/java/com/android/tools/r8/code/SgetShort.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetShort.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SgetShort extends SgetOrSput implements CfOrDexStaticFieldRead {
+public class DexSgetShort extends DexSgetOrSput implements CfOrDexStaticFieldRead {
 
   public static final int OPCODE = 0x66;
   public static final String NAME = "SgetShort";
   public static final String SMALI_NAME = "sget-short";
 
-  SgetShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexSgetShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public SgetShort(int AA, DexField BBBB) {
+  public DexSgetShort(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SgetWide.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetWide.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/SgetWide.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSgetWide.java
index 75a4343..5964d85 100644
--- a/src/main/java/com/android/tools/r8/code/SgetWide.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetWide.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SgetWide extends SgetOrSput implements CfOrDexStaticFieldRead {
+public class DexSgetWide extends DexSgetOrSput implements CfOrDexStaticFieldRead {
 
   public static final int OPCODE = 0x61;
   public static final String NAME = "SgetWide";
   public static final String SMALI_NAME = "sget-wide";
 
-  SgetWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexSgetWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public SgetWide(int AA, DexField BBBB) {
+  public DexSgetWide(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ShlInt.java b/src/main/java/com/android/tools/r8/dex/code/DexShlInt.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/ShlInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexShlInt.java
index 2f724c0..1b8780e 100644
--- a/src/main/java/com/android/tools/r8/code/ShlInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexShlInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class ShlInt extends Format23x {
+public class DexShlInt extends DexFormat23x {
 
   public static final int OPCODE = 0x98;
   public static final String NAME = "ShlInt";
   public static final String SMALI_NAME = "shl-int";
 
-  ShlInt(int high, BytecodeStream stream) {
+  DexShlInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ShlInt(int dest, int left, int right) {
+  public DexShlInt(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ShlInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexShlInt2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/ShlInt2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexShlInt2Addr.java
index 97a0c89..88ee095 100644
--- a/src/main/java/com/android/tools/r8/code/ShlInt2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexShlInt2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class ShlInt2Addr extends Format12x {
+public class DexShlInt2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xb8;
   public static final String NAME = "ShlInt2Addr";
   public static final String SMALI_NAME = "shl-int/2addr";
 
-  ShlInt2Addr(int high, BytecodeStream stream) {
+  DexShlInt2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ShlInt2Addr(int left, int right) {
+  public DexShlInt2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ShlIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexShlIntLit8.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/ShlIntLit8.java
rename to src/main/java/com/android/tools/r8/dex/code/DexShlIntLit8.java
index 173acdc..948680f 100644
--- a/src/main/java/com/android/tools/r8/code/ShlIntLit8.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexShlIntLit8.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class ShlIntLit8 extends Format22b {
+
+public class DexShlIntLit8 extends DexFormat22b {
 
   public static final int OPCODE = 0xe0;
   public static final String NAME = "ShlIntLit8";
   public static final String SMALI_NAME = "shl-int/lit8";
 
-  ShlIntLit8(int high, BytecodeStream stream) {
+  DexShlIntLit8(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ShlIntLit8(int dest, int register, int constant) {
+  public DexShlIntLit8(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ShlLong.java b/src/main/java/com/android/tools/r8/dex/code/DexShlLong.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/ShlLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexShlLong.java
index 54b98f9..1fcc10e 100644
--- a/src/main/java/com/android/tools/r8/code/ShlLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexShlLong.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class ShlLong extends Format23x {
+public class DexShlLong extends DexFormat23x {
 
   public static final int OPCODE = 0xA3;
   public static final String NAME = "ShlLong";
   public static final String SMALI_NAME = "shl-long";
 
-  ShlLong(int high, BytecodeStream stream) {
+  DexShlLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ShlLong(int dest, int left, int right) {
+  public DexShlLong(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ShlLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexShlLong2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/ShlLong2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexShlLong2Addr.java
index e7f35b0..36151a2 100644
--- a/src/main/java/com/android/tools/r8/code/ShlLong2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexShlLong2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class ShlLong2Addr extends Format12x {
+public class DexShlLong2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xc3;
   public static final String NAME = "ShlLong2Addr";
   public static final String SMALI_NAME = "shl-long/2addr";
 
-  ShlLong2Addr(int high, BytecodeStream stream) {
+  DexShlLong2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ShlLong2Addr(int left, int right) {
+  public DexShlLong2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ShrInt.java b/src/main/java/com/android/tools/r8/dex/code/DexShrInt.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/ShrInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexShrInt.java
index d51cce7..d86bdd6 100644
--- a/src/main/java/com/android/tools/r8/code/ShrInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexShrInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class ShrInt extends Format23x {
+public class DexShrInt extends DexFormat23x {
 
   public static final int OPCODE = 0x99;
   public static final String NAME = "ShrInt";
   public static final String SMALI_NAME = "shr-int";
 
-  ShrInt(int high, BytecodeStream stream) {
+  DexShrInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ShrInt(int dest, int left, int right) {
+  public DexShrInt(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ShrInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexShrInt2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/ShrInt2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexShrInt2Addr.java
index b90172b..10023c2 100644
--- a/src/main/java/com/android/tools/r8/code/ShrInt2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexShrInt2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class ShrInt2Addr extends Format12x {
+public class DexShrInt2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xb9;
   public static final String NAME = "ShrInt2Addr";
   public static final String SMALI_NAME = "shr-int/2addr";
 
-  ShrInt2Addr(int high, BytecodeStream stream) {
+  DexShrInt2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ShrInt2Addr(int left, int right) {
+  public DexShrInt2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ShrIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexShrIntLit8.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/ShrIntLit8.java
rename to src/main/java/com/android/tools/r8/dex/code/DexShrIntLit8.java
index ecb58ff..0e5e6e9 100644
--- a/src/main/java/com/android/tools/r8/code/ShrIntLit8.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexShrIntLit8.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class ShrIntLit8 extends Format22b {
+public class DexShrIntLit8 extends DexFormat22b {
 
   public static final int OPCODE = 0xe1;
   public static final String NAME = "ShrIntLit8";
   public static final String SMALI_NAME = "shr-int/lit8";
 
-  ShrIntLit8(int high, BytecodeStream stream) {
+  DexShrIntLit8(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ShrIntLit8(int dest, int register, int constant) {
+  public DexShrIntLit8(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ShrLong.java b/src/main/java/com/android/tools/r8/dex/code/DexShrLong.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/ShrLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexShrLong.java
index fbf9ef2..913535b 100644
--- a/src/main/java/com/android/tools/r8/code/ShrLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexShrLong.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class ShrLong extends Format23x {
+public class DexShrLong extends DexFormat23x {
 
   public static final int OPCODE = 0xA4;
   public static final String NAME = "ShrLong";
   public static final String SMALI_NAME = "shr-long";
 
-  ShrLong(int high, BytecodeStream stream) {
+  DexShrLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ShrLong(int dest, int left, int right) {
+  public DexShrLong(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/ShrLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexShrLong2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/ShrLong2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexShrLong2Addr.java
index 4732c39..c73273f 100644
--- a/src/main/java/com/android/tools/r8/code/ShrLong2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexShrLong2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class ShrLong2Addr extends Format12x {
+public class DexShrLong2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xc4;
   public static final String NAME = "ShrLong2Addr";
   public static final String SMALI_NAME = "shr-long/2addr";
 
-  ShrLong2Addr(int high, BytecodeStream stream) {
+  DexShrLong2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public ShrLong2Addr(int left, int right) {
+  public DexShrLong2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SparseSwitch.java b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitch.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/code/SparseSwitch.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSparseSwitch.java
index b0a048a..4f15ab7 100644
--- a/src/main/java/com/android/tools/r8/code/SparseSwitch.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitch.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.naming.ClassNameMapper;
 
-public class SparseSwitch extends Format31t {
+public class DexSparseSwitch extends DexFormat31t {
 
   public static final int OPCODE = 0x2c;
   public static final String NAME = "SparseSwitch";
   public static final String SMALI_NAME = "sparse-switch";
 
-  SparseSwitch(int high, BytecodeStream stream) {
+  DexSparseSwitch(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public SparseSwitch(int value) {
+  public DexSparseSwitch(int value) {
     super(value, -1);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SparseSwitchPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/SparseSwitchPayload.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java
index 9dac193e..f9ed49e 100644
--- a/src/main/java/com/android/tools/r8/code/SparseSwitchPayload.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java
@@ -1,7 +1,7 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
@@ -14,17 +14,17 @@
 import java.nio.ShortBuffer;
 import java.util.Arrays;
 
-public class SparseSwitchPayload extends SwitchPayload {
+public class DexSparseSwitchPayload extends DexSwitchPayload {
 
   public final int size;
   public final int[] keys;
   public final /* offset */ int[] targets;
 
-  private static void specify(StructuralSpecification<SparseSwitchPayload, ?> spec) {
+  private static void specify(StructuralSpecification<DexSparseSwitchPayload, ?> spec) {
     spec.withInt(i -> i.size).withIntArray(i -> i.keys).withIntArray(i -> i.targets);
   }
 
-  public SparseSwitchPayload(int high, BytecodeStream stream) {
+  public DexSparseSwitchPayload(int high, BytecodeStream stream) {
     super(high, stream);
     size = read16BitValue(stream);
     keys = new int[size];
@@ -38,8 +38,8 @@
     }
   }
 
-  public SparseSwitchPayload(int[] keys, int[] targets) {
-    assert targets.length > 0;  // Empty switches should be eliminated.
+  public DexSparseSwitchPayload(int[] keys, int[] targets) {
+    assert targets.length > 0; // Empty switches should be eliminated.
     this.size = targets.length;
     this.keys = keys;
     this.targets = targets;
@@ -57,7 +57,7 @@
       GraphLens graphLens,
       ObjectToOffsetMapping mapping,
       LensCodeRewriterUtils rewriter) {
-    writeFirst(2, dest);  // Pseudo-opcode = 0x0200
+    writeFirst(2, dest); // Pseudo-opcode = 0x0200
     write16BitValue(size, dest);
     for (int i = 0; i < size; i++) {
       write32BitValue(keys[i], dest);
@@ -68,8 +68,8 @@
   }
 
   @Override
-  final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) {
-    return visitor.visit(this, (SparseSwitchPayload) other, SparseSwitchPayload::specify);
+  final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) {
+    return visitor.visit(this, (DexSparseSwitchPayload) other, DexSparseSwitchPayload::specify);
   }
 
   @Override
@@ -107,7 +107,7 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming, Instruction payloadUser) {
+  public String toString(ClassNameMapper naming, DexInstruction payloadUser) {
     StringBuilder builder = new StringBuilder("[SparseSwitchPayload");
     if (payloadUser == null) {
       builder.append(" offsets relative to associated SparseSwitch");
@@ -127,7 +127,7 @@
   }
 
   @Override
-  public String toSmaliString(Instruction payloadUser) {
+  public String toSmaliString(DexInstruction payloadUser) {
     StringBuilder builder = new StringBuilder();
     builder.append("    ");
     builder.append(".sparse-switch");
diff --git a/src/main/java/com/android/tools/r8/code/Sput.java b/src/main/java/com/android/tools/r8/dex/code/DexSput.java
similarity index 84%
rename from src/main/java/com/android/tools/r8/code/Sput.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSput.java
index e9e7f56..8a7ab46 100644
--- a/src/main/java/com/android/tools/r8/code/Sput.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSput.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class Sput extends SgetOrSput {
+public class DexSput extends DexSgetOrSput {
 
   public static final int OPCODE = 0x67;
   public static final String NAME = "Sput";
   public static final String SMALI_NAME = "sput";
 
-  Sput(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  DexSput(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public Sput(int AA, DexField BBBB) {
+  public DexSput(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SputBoolean.java b/src/main/java/com/android/tools/r8/dex/code/DexSputBoolean.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/SputBoolean.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSputBoolean.java
index d3ba949..1bc6555 100644
--- a/src/main/java/com/android/tools/r8/code/SputBoolean.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSputBoolean.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SputBoolean extends SgetOrSput {
+public class DexSputBoolean extends DexSgetOrSput {
 
   public static final int OPCODE = 0x6a;
   public static final String NAME = "SputBoolean";
   public static final String SMALI_NAME = "sput-boolean";
 
-  /*package*/ SputBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexSputBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public SputBoolean(int AA, DexField BBBB) {
+  public DexSputBoolean(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SputByte.java b/src/main/java/com/android/tools/r8/dex/code/DexSputByte.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/SputByte.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSputByte.java
index e1c09f5..40f754e 100644
--- a/src/main/java/com/android/tools/r8/code/SputByte.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSputByte.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SputByte extends SgetOrSput {
+public class DexSputByte extends DexSgetOrSput {
 
   public static final int OPCODE = 0x6b;
   public static final String NAME = "SputByte";
   public static final String SMALI_NAME = "sput-byte";
 
-  /*package*/ SputByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexSputByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public SputByte(int AA, DexField BBBB) {
+  public DexSputByte(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SputChar.java b/src/main/java/com/android/tools/r8/dex/code/DexSputChar.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/SputChar.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSputChar.java
index 2497f76..c4a1174 100644
--- a/src/main/java/com/android/tools/r8/code/SputChar.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSputChar.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SputChar extends SgetOrSput {
+public class DexSputChar extends DexSgetOrSput {
 
   public static final int OPCODE = 0x6c;
   public static final String NAME = "SputChar";
   public static final String SMALI_NAME = "sput-char";
 
-  /*package*/ SputChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexSputChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public SputChar(int AA, DexField BBBB) {
+  public DexSputChar(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SputObject.java b/src/main/java/com/android/tools/r8/dex/code/DexSputObject.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/SputObject.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSputObject.java
index 43a92b6..91dfca4 100644
--- a/src/main/java/com/android/tools/r8/code/SputObject.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSputObject.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SputObject extends SgetOrSput {
+public class DexSputObject extends DexSgetOrSput {
 
   public static final int OPCODE = 0x69;
   public static final String NAME = "SputObject";
   public static final String SMALI_NAME = "sput-object";
 
-  /*package*/ SputObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexSputObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public SputObject(int AA, DexField BBBB) {
+  public DexSputObject(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SputShort.java b/src/main/java/com/android/tools/r8/dex/code/DexSputShort.java
similarity index 82%
rename from src/main/java/com/android/tools/r8/code/SputShort.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSputShort.java
index 2335606..d4aec47 100644
--- a/src/main/java/com/android/tools/r8/code/SputShort.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSputShort.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SputShort extends SgetOrSput {
+public class DexSputShort extends DexSgetOrSput {
 
   public static final int OPCODE = 0x6d;
   public static final String NAME = "SputShort";
   public static final String SMALI_NAME = "sput-short";
 
-  /*package*/ SputShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexSputShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public SputShort(int AA, DexField BBBB) {
+  public DexSputShort(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SputWide.java b/src/main/java/com/android/tools/r8/dex/code/DexSputWide.java
similarity index 83%
rename from src/main/java/com/android/tools/r8/code/SputWide.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSputWide.java
index 278418a..a3a8003 100644
--- a/src/main/java/com/android/tools/r8/code/SputWide.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSputWide.java
@@ -1,24 +1,24 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SputWide extends SgetOrSput {
+public class DexSputWide extends DexSgetOrSput {
 
   public static final int OPCODE = 0x68;
   public static final String NAME = "SputWide";
   public static final String SMALI_NAME = "sput-wide";
 
-  /*package*/ SputWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
+  /*package*/ DexSputWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
     super(high, stream, mapping.getFieldMap());
   }
 
-  public SputWide(int AA, DexField BBBB) {
+  public DexSputWide(int AA, DexField BBBB) {
     super(AA, BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SubDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexSubDouble.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/SubDouble.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSubDouble.java
index f68b270..fc2176e 100644
--- a/src/main/java/com/android/tools/r8/code/SubDouble.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSubDouble.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SubDouble extends Format23x {
+public class DexSubDouble extends DexFormat23x {
 
   public static final int OPCODE = 0xac;
   public static final String NAME = "SubDouble";
   public static final String SMALI_NAME = "sub-double";
 
-  SubDouble(int high, BytecodeStream stream) {
+  DexSubDouble(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public SubDouble(int dest, int left, int right) {
+  public DexSubDouble(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SubDouble2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexSubDouble2Addr.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/SubDouble2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSubDouble2Addr.java
index 2cd16ac..3b99bfc 100644
--- a/src/main/java/com/android/tools/r8/code/SubDouble2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSubDouble2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SubDouble2Addr extends Format12x {
+public class DexSubDouble2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xcc;
   public static final String NAME = "SubDouble2Addr";
   public static final String SMALI_NAME = "sub-double/2addr";
 
-  SubDouble2Addr(int high, BytecodeStream stream) {
+  DexSubDouble2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public SubDouble2Addr(int left, int right) {
+  public DexSubDouble2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SubFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexSubFloat.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/SubFloat.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSubFloat.java
index e49e843..45fa530 100644
--- a/src/main/java/com/android/tools/r8/code/SubFloat.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSubFloat.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SubFloat extends Format23x {
+public class DexSubFloat extends DexFormat23x {
 
   public static final int OPCODE = 0xA7;
   public static final String NAME = "SubFloat";
   public static final String SMALI_NAME = "sub-float";
 
-  SubFloat(int high, BytecodeStream stream) {
+  DexSubFloat(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public SubFloat(int dest, int left, int right) {
+  public DexSubFloat(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SubFloat2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexSubFloat2Addr.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/SubFloat2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSubFloat2Addr.java
index 42c4442..4df6f33 100644
--- a/src/main/java/com/android/tools/r8/code/SubFloat2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSubFloat2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SubFloat2Addr extends Format12x {
+public class DexSubFloat2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xc7;
   public static final String NAME = "SubFloat2Addr";
   public static final String SMALI_NAME = "sub-float/2addr";
 
-  SubFloat2Addr(int high, BytecodeStream stream) {
+  DexSubFloat2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public SubFloat2Addr(int left, int right) {
+  public DexSubFloat2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SubInt.java b/src/main/java/com/android/tools/r8/dex/code/DexSubInt.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/SubInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSubInt.java
index d187ea3..a161d5c 100644
--- a/src/main/java/com/android/tools/r8/code/SubInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSubInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SubInt extends Format23x {
+public class DexSubInt extends DexFormat23x {
 
   public static final int OPCODE = 0x91;
   public static final String NAME = "SubInt";
   public static final String SMALI_NAME = "sub-int";
 
-  SubInt(int high, BytecodeStream stream) {
+  DexSubInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public SubInt(int dest, int left, int right) {
+  public DexSubInt(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SubInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexSubInt2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/SubInt2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSubInt2Addr.java
index 97f94a4..314744c 100644
--- a/src/main/java/com/android/tools/r8/code/SubInt2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSubInt2Addr.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class SubInt2Addr extends Format12x {
+
+public class DexSubInt2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xb1;
   public static final String NAME = "SubInt2Addr";
   public static final String SMALI_NAME = "sub-int/2addr";
 
-  SubInt2Addr(int high, BytecodeStream stream) {
+  DexSubInt2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public SubInt2Addr(int left, int right) {
+  public DexSubInt2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SubLong.java b/src/main/java/com/android/tools/r8/dex/code/DexSubLong.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/SubLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSubLong.java
index a2a0697..e418a52 100644
--- a/src/main/java/com/android/tools/r8/code/SubLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSubLong.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class SubLong extends Format23x {
+public class DexSubLong extends DexFormat23x {
 
   public static final int OPCODE = 0x9c;
   public static final String NAME = "SubLong";
   public static final String SMALI_NAME = "sub-long";
 
-  SubLong(int high, BytecodeStream stream) {
+  DexSubLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public SubLong(int dest, int left, int right) {
+  public DexSubLong(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SubLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexSubLong2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/SubLong2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSubLong2Addr.java
index 40d2c6b..75e13b7 100644
--- a/src/main/java/com/android/tools/r8/code/SubLong2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSubLong2Addr.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class SubLong2Addr extends Format12x {
+
+public class DexSubLong2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xbc;
   public static final String NAME = "SubLong2Addr";
   public static final String SMALI_NAME = "sub-long/2addr";
 
-  SubLong2Addr(int high, BytecodeStream stream) {
+  DexSubLong2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public SubLong2Addr(int left, int right) {
+  public DexSubLong2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/SwitchPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexSwitchPayload.java
similarity index 76%
rename from src/main/java/com/android/tools/r8/code/SwitchPayload.java
rename to src/main/java/com/android/tools/r8/dex/code/DexSwitchPayload.java
index 0525e41..7f18ec2 100644
--- a/src/main/java/com/android/tools/r8/code/SwitchPayload.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSwitchPayload.java
@@ -2,20 +2,21 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public abstract class SwitchPayload extends Nop {
-  SwitchPayload(int high, BytecodeStream stream) {
+public abstract class DexSwitchPayload extends DexNop {
+  DexSwitchPayload(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public SwitchPayload() {
-  }
+  public DexSwitchPayload() {}
 
   public abstract int[] keys();
+
   public abstract int numberOfKeys();
+
   public abstract int[] switchTargetOffsets();
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/code/Throw.java b/src/main/java/com/android/tools/r8/dex/code/DexThrow.java
similarity index 84%
rename from src/main/java/com/android/tools/r8/code/Throw.java
rename to src/main/java/com/android/tools/r8/dex/code/DexThrow.java
index 40d69f1..2df333a 100644
--- a/src/main/java/com/android/tools/r8/code/Throw.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexThrow.java
@@ -1,21 +1,21 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class Throw extends Format11x {
+public class DexThrow extends DexFormat11x {
 
   public static final int OPCODE = 0x27;
   public static final String NAME = "Throw";
   public static final String SMALI_NAME = "throw";
 
-  Throw(int high, BytecodeStream stream) {
+  DexThrow(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public Throw(int AA) {
+  public DexThrow(int AA) {
     super(AA);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/UshrInt.java b/src/main/java/com/android/tools/r8/dex/code/DexUshrInt.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/UshrInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexUshrInt.java
index 6f480b1..c3ac597 100644
--- a/src/main/java/com/android/tools/r8/code/UshrInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexUshrInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class UshrInt extends Format23x {
+public class DexUshrInt extends DexFormat23x {
 
   public static final int OPCODE = 0x9A;
   public static final String NAME = "UshrInt";
   public static final String SMALI_NAME = "ushr-int";
 
-  UshrInt(int high, BytecodeStream stream) {
+  DexUshrInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public UshrInt(int dest, int left, int right) {
+  public DexUshrInt(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/UshrInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexUshrInt2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/UshrInt2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexUshrInt2Addr.java
index 3d9c135..fc5e4a7 100644
--- a/src/main/java/com/android/tools/r8/code/UshrInt2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexUshrInt2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class UshrInt2Addr extends Format12x {
+public class DexUshrInt2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xba;
   public static final String NAME = "UshrInt2Addr";
   public static final String SMALI_NAME = "ushr-int/2addr";
 
-  UshrInt2Addr(int high, BytecodeStream stream) {
+  DexUshrInt2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public UshrInt2Addr(int left, int right) {
+  public DexUshrInt2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/UshrIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexUshrIntLit8.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/UshrIntLit8.java
rename to src/main/java/com/android/tools/r8/dex/code/DexUshrIntLit8.java
index 499c34d..625e1ee 100644
--- a/src/main/java/com/android/tools/r8/code/UshrIntLit8.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexUshrIntLit8.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class UshrIntLit8 extends Format22b {
+public class DexUshrIntLit8 extends DexFormat22b {
 
   public static final int OPCODE = 0xe2;
   public static final String NAME = "UshrIntLit8";
   public static final String SMALI_NAME = "ushr-int/lit8";
 
-  UshrIntLit8(int high, BytecodeStream stream) {
+  DexUshrIntLit8(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public UshrIntLit8(int dest, int register, int constant) {
+  public DexUshrIntLit8(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/UshrLong.java b/src/main/java/com/android/tools/r8/dex/code/DexUshrLong.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/UshrLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexUshrLong.java
index 43b816a..0aed94f 100644
--- a/src/main/java/com/android/tools/r8/code/UshrLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexUshrLong.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class UshrLong extends Format23x {
+
+public class DexUshrLong extends DexFormat23x {
 
   public static final int OPCODE = 0xa5;
   public static final String NAME = "UshrLong";
   public static final String SMALI_NAME = "ushr-long";
 
-  UshrLong(int high, BytecodeStream stream) {
+  DexUshrLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public UshrLong(int dest, int left, int right) {
+  public DexUshrLong(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/UshrLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexUshrLong2Addr.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/UshrLong2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexUshrLong2Addr.java
index 1651d6d..d140899 100644
--- a/src/main/java/com/android/tools/r8/code/UshrLong2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexUshrLong2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class UshrLong2Addr extends Format12x {
+public class DexUshrLong2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xc5;
   public static final String NAME = "UshrLong2Addr";
   public static final String SMALI_NAME = "ushr-long/2addr";
 
-  UshrLong2Addr(int high, BytecodeStream stream) {
+  DexUshrLong2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public UshrLong2Addr(int left, int right) {
+  public DexUshrLong2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/XorInt.java b/src/main/java/com/android/tools/r8/dex/code/DexXorInt.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/XorInt.java
rename to src/main/java/com/android/tools/r8/dex/code/DexXorInt.java
index 3e68cf6..063e107 100644
--- a/src/main/java/com/android/tools/r8/code/XorInt.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexXorInt.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class XorInt extends Format23x {
+public class DexXorInt extends DexFormat23x {
 
   public static final int OPCODE = 0x97;
   public static final String NAME = "XorInt";
   public static final String SMALI_NAME = "xor-int";
 
-  XorInt(int high, BytecodeStream stream) {
+  DexXorInt(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public XorInt(int dest, int left, int right) {
+  public DexXorInt(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/XorInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexXorInt2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/XorInt2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexXorInt2Addr.java
index 1c0f1a6..b927dba 100644
--- a/src/main/java/com/android/tools/r8/code/XorInt2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexXorInt2Addr.java
@@ -1,21 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-public class XorInt2Addr extends Format12x {
+
+public class DexXorInt2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xb7;
   public static final String NAME = "XorInt2Addr";
   public static final String SMALI_NAME = "xor-int/2addr";
 
-  XorInt2Addr(int high, BytecodeStream stream) {
+  DexXorInt2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public XorInt2Addr(int left, int right) {
+  public DexXorInt2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/XorIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexXorIntLit16.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/XorIntLit16.java
rename to src/main/java/com/android/tools/r8/dex/code/DexXorIntLit16.java
index 8efa8ac..e55d037 100644
--- a/src/main/java/com/android/tools/r8/code/XorIntLit16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexXorIntLit16.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class XorIntLit16 extends Format22s {
+public class DexXorIntLit16 extends DexFormat22s {
 
   public static final int OPCODE = 0xd7;
   public static final String NAME = "XorIntLit16";
   public static final String SMALI_NAME = "xor-int/lit16";
 
-  XorIntLit16(int high, BytecodeStream stream) {
+  DexXorIntLit16(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public XorIntLit16(int dest, int register, int constant) {
+  public DexXorIntLit16(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/XorIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexXorIntLit8.java
similarity index 80%
rename from src/main/java/com/android/tools/r8/code/XorIntLit8.java
rename to src/main/java/com/android/tools/r8/dex/code/DexXorIntLit8.java
index 8447abb..0cdceff 100644
--- a/src/main/java/com/android/tools/r8/code/XorIntLit8.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexXorIntLit8.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class XorIntLit8 extends Format22b {
+public class DexXorIntLit8 extends DexFormat22b {
 
   public static final int OPCODE = 0xdf;
   public static final String NAME = "XorIntLit8";
   public static final String SMALI_NAME = "xor-int/lit8";
 
-  XorIntLit8(int high, BytecodeStream stream) {
+  DexXorIntLit8(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public XorIntLit8(int dest, int register, int constant) {
+  public DexXorIntLit8(int dest, int register, int constant) {
     super(dest, register, constant);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/XorLong.java b/src/main/java/com/android/tools/r8/dex/code/DexXorLong.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/XorLong.java
rename to src/main/java/com/android/tools/r8/dex/code/DexXorLong.java
index c2f7b7f..53a3deb 100644
--- a/src/main/java/com/android/tools/r8/code/XorLong.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexXorLong.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class XorLong extends Format23x {
+public class DexXorLong extends DexFormat23x {
 
   public static final int OPCODE = 0xA2;
   public static final String NAME = "XorLong";
   public static final String SMALI_NAME = "xor-long";
 
-  XorLong(int high, BytecodeStream stream) {
+  DexXorLong(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public XorLong(int dest, int left, int right) {
+  public DexXorLong(int dest, int left, int right) {
     super(dest, left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/code/XorLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexXorLong2Addr.java
similarity index 81%
rename from src/main/java/com/android/tools/r8/code/XorLong2Addr.java
rename to src/main/java/com/android/tools/r8/dex/code/DexXorLong2Addr.java
index ec3f5ef..6e8ddb3 100644
--- a/src/main/java/com/android/tools/r8/code/XorLong2Addr.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexXorLong2Addr.java
@@ -1,22 +1,22 @@
 // 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.code;
+package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 
-public class XorLong2Addr extends Format12x {
+public class DexXorLong2Addr extends DexFormat12x {
 
   public static final int OPCODE = 0xc2;
   public static final String NAME = "XorLong2Addr";
   public static final String SMALI_NAME = "xor-long/2addr";
 
-  XorLong2Addr(int high, BytecodeStream stream) {
+  DexXorLong2Addr(int high, BytecodeStream stream) {
     super(high, stream);
   }
 
-  public XorLong2Addr(int left, int right) {
+  public DexXorLong2Addr(int left, int right) {
     super(left, right);
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index 3a727a8..321c775 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -18,8 +18,8 @@
 import com.android.tools.r8.cf.code.CfPosition;
 import com.android.tools.r8.cf.code.CfReturnVoid;
 import com.android.tools.r8.cf.code.CfTryCatch;
-import com.android.tools.r8.code.Base5Format;
-import com.android.tools.r8.code.CfOrDexInstruction;
+import com.android.tools.r8.dex.code.CfOrDexInstruction;
+import com.android.tools.r8.dex.code.DexBase5Format;
 import com.android.tools.r8.errors.InvalidDebugInfoException;
 import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.errors.Unreachable;
@@ -303,7 +303,7 @@
 
   @Override
   public int estimatedDexCodeSizeUpperBoundInBytes() {
-    return estimatedSizeForInlining() * Base5Format.SIZE;
+    return estimatedSizeForInlining() * DexBase5Format.SIZE;
   }
 
   public int bytecodeSizeUpperBound() {
diff --git a/src/main/java/com/android/tools/r8/graph/Code.java b/src/main/java/com/android/tools/r8/graph/Code.java
index 8152305..0edeb6f 100644
--- a/src/main/java/com/android/tools/r8/graph/Code.java
+++ b/src/main/java/com/android/tools/r8/graph/Code.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
-import com.android.tools.r8.code.CfOrDexInstruction;
 import com.android.tools.r8.dex.MixedSectionCollection;
+import com.android.tools.r8.dex.code.CfOrDexInstruction;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.bytecodemetadata.BytecodeInstructionMetadata;
 import com.android.tools.r8.graph.bytecodemetadata.BytecodeMetadata;
diff --git a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
index 07fd8c4..906d92d 100644
--- a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
@@ -9,11 +9,11 @@
 import com.android.tools.r8.cf.code.CfInvoke;
 import com.android.tools.r8.cf.code.CfLoad;
 import com.android.tools.r8.cf.code.CfReturnVoid;
-import com.android.tools.r8.code.InvokeDirect;
-import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.dex.CodeToKeep;
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.dex.MixedSectionCollection;
+import com.android.tools.r8.dex.code.DexInvokeDirect;
+import com.android.tools.r8.dex.code.DexReturnVoid;
 import com.android.tools.r8.graph.DexCode.Try;
 import com.android.tools.r8.graph.DexCode.TryHandler;
 import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
@@ -169,7 +169,7 @@
 
   @Override
   public int codeSizeInBytes() {
-    return InvokeDirect.SIZE + ReturnVoid.SIZE;
+    return DexInvokeDirect.SIZE + DexReturnVoid.SIZE;
   }
 
   @Override
@@ -369,9 +369,9 @@
       GraphLens graphLens,
       LensCodeRewriterUtils lensCodeRewriter,
       ObjectToOffsetMapping mapping) {
-    new InvokeDirect(1, getParentConstructor(context, mapping.dexItemFactory()), 0, 0, 0, 0, 0)
+    new DexInvokeDirect(1, getParentConstructor(context, mapping.dexItemFactory()), 0, 0, 0, 0, 0)
         .write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
-    new ReturnVoid().write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
+    new DexReturnVoid().write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index c99b310..8dd617b 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -3,14 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
-import com.android.tools.r8.code.CfOrDexInstruction;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.ReturnVoid;
-import com.android.tools.r8.code.SwitchPayload;
 import com.android.tools.r8.dex.CodeToKeep;
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.dex.JumboStringRewriter;
 import com.android.tools.r8.dex.MixedSectionCollection;
+import com.android.tools.r8.dex.code.CfOrDexInstruction;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexReturnVoid;
+import com.android.tools.r8.dex.code.DexSwitchPayload;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.DexCode.TryHandler.TypeAddrPair;
 import com.android.tools.r8.graph.DexDebugEvent.SetPositionFrame;
@@ -60,13 +60,13 @@
   public final int outgoingRegisterSize;
   public final Try[] tries;
   public final TryHandler[] handlers;
-  public final Instruction[] instructions;
+  public final DexInstruction[] instructions;
 
   public DexString highestSortingString;
   private DexDebugInfo debugInfo;
   private DexDebugInfoForWriting debugInfoForWriting;
 
-  private final BytecodeMetadata<Instruction> metadata;
+  private final BytecodeMetadata<DexInstruction> metadata;
 
   private static void specify(StructuralSpecification<DexCode, ?> spec) {
     spec.withInt(c -> c.registerSize)
@@ -82,7 +82,7 @@
       int registerSize,
       int insSize,
       int outsSize,
-      Instruction[] instructions,
+      DexInstruction[] instructions,
       Try[] tries,
       TryHandler[] handlers,
       DexDebugInfo debugInfo) {
@@ -101,11 +101,11 @@
       int registerSize,
       int insSize,
       int outsSize,
-      Instruction[] instructions,
+      DexInstruction[] instructions,
       Try[] tries,
       TryHandler[] handlers,
       DexDebugInfo debugInfo,
-      BytecodeMetadata<Instruction> metadata) {
+      BytecodeMetadata<DexInstruction> metadata) {
     this.incomingRegisterSize = insSize;
     this.registerSize = registerSize;
     this.outgoingRegisterSize = outsSize;
@@ -126,7 +126,7 @@
   }
 
   @Override
-  public BytecodeMetadata<Instruction> getMetadata() {
+  public BytecodeMetadata<DexInstruction> getMetadata() {
     return metadata;
   }
 
@@ -135,7 +135,7 @@
     return getMetadata(instruction.asDexInstruction());
   }
 
-  public BytecodeInstructionMetadata getMetadata(Instruction instruction) {
+  public BytecodeInstructionMetadata getMetadata(DexInstruction instruction) {
     return metadata.getMetadata(instruction);
   }
 
@@ -157,8 +157,8 @@
       firstJumboString = mapping.getFirstString();
     } else {
       assert highestSortingString != null
-          || Arrays.stream(instructions).noneMatch(Instruction::isConstString);
-      assert Arrays.stream(instructions).noneMatch(Instruction::isDexItemBasedConstString);
+          || Arrays.stream(instructions).noneMatch(DexInstruction::isConstString);
+      assert Arrays.stream(instructions).noneMatch(DexInstruction::isDexItemBasedConstString);
       if (highestSortingString != null
           && highestSortingString.isGreaterThanOrEqualTo(mapping.getFirstJumboString())) {
         firstJumboString = mapping.getFirstJumboString();
@@ -171,7 +171,7 @@
 
   @Override
   public void setCallSiteContexts(ProgramMethod method) {
-    for (Instruction instruction : instructions) {
+    for (DexInstruction instruction : instructions) {
       DexCallSite callSite = instruction.getCallSite();
       if (callSite != null) {
         callSite.setContext(method.getReference(), instruction.getOffset());
@@ -363,7 +363,7 @@
 
   @Override
   public boolean isEmptyVoidMethod() {
-    return instructions.length == 1 && instructions[0] instanceof ReturnVoid;
+    return instructions.length == 1 && instructions[0] instanceof DexReturnVoid;
   }
 
   @Override
@@ -421,7 +421,7 @@
 
   private void internalRegisterCodeReferences(DexClassAndMethod method, UseRegistry registry) {
     assert registry.getTraversalContinuation().shouldContinue();
-    for (Instruction insn : instructions) {
+    for (DexInstruction insn : instructions) {
       insn.registerUse(registry);
       if (registry.getTraversalContinuation().shouldBreak()) {
         return;
@@ -456,8 +456,8 @@
     builder.append("------------------------------------------------------------\n");
 
     // Collect payload users.
-    Map<Integer, Instruction> payloadUsers = new HashMap<>();
-    for (Instruction dex : instructions) {
+    Map<Integer, DexInstruction> payloadUsers = new HashMap<>();
+    for (DexInstruction dex : instructions) {
       if (dex.hasPayload()) {
         payloadUsers.put(dex.getOffset() + dex.getPayloadOffset(), dex);
       }
@@ -472,7 +472,7 @@
     }
     int instructionNumber = 0;
     Map<Integer, DebugLocalInfo> locals = Collections.emptyMap();
-    for (Instruction insn : instructions) {
+    for (DexInstruction insn : instructions) {
       debugInfo = advanceToOffset(insn.getOffset() - 1, debugInfo, debugInfoIterator);
       while (debugInfo != null && debugInfo.address == insn.getOffset()) {
         if (debugInfo.lineEntry || !locals.equals(debugInfo.locals)) {
@@ -484,7 +484,7 @@
       StringUtils.appendLeftPadded(builder, Integer.toString(instructionNumber++), 5);
       builder.append(": ");
       if (insn.isSwitchPayload()) {
-        Instruction payloadUser = payloadUsers.get(insn.getOffset());
+        DexInstruction payloadUser = payloadUsers.get(insn.getOffset());
         builder.append(insn.toString(naming, payloadUser));
       } else {
         builder.append(insn.toString(naming));
@@ -494,7 +494,7 @@
     if (isPcBasedInfo) {
       builder.append(getDebugInfo()).append("\n");
     } else if (debugInfoIterator.hasNext()) {
-      Instruction lastInstruction = ArrayUtils.last(instructions);
+      DexInstruction lastInstruction = ArrayUtils.last(instructions);
       debugInfo = advanceToOffset(lastInstruction.getOffset(), debugInfo, debugInfoIterator);
       if (debugInfo != null) {
         throw new Unreachable("Could not print all debug information.");
@@ -531,12 +531,12 @@
   public String toSmaliString(ClassNameMapper naming) {
     StringBuilder builder = new StringBuilder();
     // Find labeled targets.
-    Map<Integer, Instruction> payloadUsers = new HashMap<>();
+    Map<Integer, DexInstruction> payloadUsers = new HashMap<>();
     Set<Integer> labledTargets = new HashSet<>();
     // Collect payload users and labeled targets for non-payload instructions.
-    for (Instruction dex : instructions) {
+    for (DexInstruction dex : instructions) {
       int[] targets = dex.getTargets();
-      if (targets != Instruction.NO_TARGETS && targets != Instruction.EXIT_TARGET) {
+      if (targets != DexInstruction.NO_TARGETS && targets != DexInstruction.EXIT_TARGET) {
         assert targets.length <= 2;
         // For if instructions the second target is the fallthrough, for which no label is needed.
         labledTargets.add(dex.getOffset() + targets[0]);
@@ -546,11 +546,11 @@
       }
     }
     // Collect labeled targets for payload instructions.
-    for (Instruction dex : instructions) {
+    for (DexInstruction dex : instructions) {
       if (dex.isSwitchPayload()) {
-        Instruction payloadUser = payloadUsers.get(dex.getOffset());
-        if (dex instanceof SwitchPayload) {
-          SwitchPayload payload = (SwitchPayload) dex;
+        DexInstruction payloadUser = payloadUsers.get(dex.getOffset());
+        if (dex instanceof DexSwitchPayload) {
+          DexSwitchPayload payload = (DexSwitchPayload) dex;
           for (int target : payload.switchTargetOffsets()) {
             labledTargets.add(payloadUser.getOffset() + target);
           }
@@ -558,14 +558,14 @@
       }
     }
     // Generate smali for all instructions.
-    for (Instruction dex : instructions) {
+    for (DexInstruction dex : instructions) {
       if (labledTargets.contains(dex.getOffset())) {
         builder.append("  :label_");
         builder.append(dex.getOffset());
         builder.append("\n");
       }
       if (dex.isSwitchPayload()) {
-        Instruction payloadUser = payloadUsers.get(dex.getOffset());
+        DexInstruction payloadUser = payloadUsers.get(dex.getOffset());
         builder.append(dex.toSmaliString(payloadUser)).append('\n');
       } else {
         builder.append(dex.toSmaliString(naming)).append('\n');
@@ -594,7 +594,7 @@
       GraphLens graphLens,
       LensCodeRewriterUtils rewriter) {
     highestSortingString = null;
-    for (Instruction insn : instructions) {
+    for (DexInstruction insn : instructions) {
       assert !insn.isDexItemBasedConstString();
       insn.collectIndexedItems(indexedItems, context, graphLens, rewriter);
       if (insn.isConstString()) {
@@ -665,7 +665,7 @@
 
   @Override
   public int codeSizeInBytes() {
-    Instruction last = instructions[instructions.length - 1];
+    DexInstruction last = instructions[instructions.length - 1];
     assert last.hasOffset();
     int result = last.getOffset() + last.getSize();
     assert result == computeCodeSizeInBytes();
@@ -674,7 +674,7 @@
 
   private int computeCodeSizeInBytes() {
     int size = 0;
-    for (Instruction insn : instructions) {
+    for (DexInstruction insn : instructions) {
       size += insn.getSize();
     }
     return size;
@@ -682,7 +682,7 @@
 
   @Override
   public void writeKeepRulesForDesugaredLibrary(CodeToKeep desugaredLibraryCodeToKeep) {
-    for (Instruction instruction : instructions) {
+    for (DexInstruction instruction : instructions) {
       DexMethod method = instruction.getMethod();
       DexField field = instruction.getField();
       if (field != null) {
@@ -707,7 +707,7 @@
       GraphLens graphLens,
       LensCodeRewriterUtils lensCodeRewriter,
       ObjectToOffsetMapping mapping) {
-    for (Instruction instruction : instructions) {
+    for (DexInstruction instruction : instructions) {
       instruction.write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
     }
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java b/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java
index 09f740e..88d9f04 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java
@@ -3,11 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
-import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.DebugBytecodeWriter;
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.dex.MixedSectionCollection;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.utils.ArrayUtils;
 import com.android.tools.r8.utils.LebUtils;
@@ -298,7 +298,7 @@
     List<DexDebugEvent> events = new ArrayList<>(code.instructions.length);
     int pc = 0;
     int delta = 0;
-    for (Instruction instruction : code.instructions) {
+    for (DexInstruction instruction : code.instructions) {
       if (instruction.canThrow()) {
         DexDebugEventBuilder.addDefaultEventWithAdvancePcIfNecessary(delta, delta, events, factory);
         pc += delta;
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 4196ca2..73e3420 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -29,16 +29,16 @@
 import com.android.tools.r8.cf.code.CfStackInstruction.Opcode;
 import com.android.tools.r8.cf.code.CfStore;
 import com.android.tools.r8.cf.code.CfThrow;
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.InstanceOf;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.InvokeDirect;
-import com.android.tools.r8.code.InvokeStatic;
-import com.android.tools.r8.code.NewInstance;
-import com.android.tools.r8.code.Return;
-import com.android.tools.r8.code.Throw;
-import com.android.tools.r8.code.XorIntLit8;
 import com.android.tools.r8.dex.MixedSectionCollection;
+import com.android.tools.r8.dex.code.DexConstString;
+import com.android.tools.r8.dex.code.DexInstanceOf;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeDirect;
+import com.android.tools.r8.dex.code.DexInvokeStatic;
+import com.android.tools.r8.dex.code.DexNewInstance;
+import com.android.tools.r8.dex.code.DexReturn;
+import com.android.tools.r8.dex.code.DexThrow;
+import com.android.tools.r8.dex.code.DexXorIntLit8;
 import com.android.tools.r8.errors.InternalCompilerError;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.DexAnnotation.AnnotatedKind;
@@ -889,13 +889,11 @@
     return getReference().toSourceString();
   }
 
-  /**
-   * Generates a {@link DexCode} object for the given instructions.
-   */
+  /** Generates a {@link DexCode} object for the given instructions. */
   private DexCode generateCodeFromTemplate(
-      int numberOfRegisters, int outRegisters, Instruction... instructions) {
+      int numberOfRegisters, int outRegisters, DexInstruction... instructions) {
     int offset = 0;
-    for (Instruction instruction : instructions) {
+    for (DexInstruction instruction : instructions) {
       instruction.setOffset(offset);
       offset += instruction.getSize();
     }
@@ -937,13 +935,13 @@
   }
 
   public DexCode buildInstanceOfDexCode(DexType type, boolean negate) {
-    Instruction[] instructions = new Instruction[2 + BooleanUtils.intValue(negate)];
+    DexInstruction[] instructions = new DexInstruction[2 + BooleanUtils.intValue(negate)];
     int i = 0;
-    instructions[i++] = new InstanceOf(0, 0, type);
+    instructions[i++] = new DexInstanceOf(0, 0, type);
     if (negate) {
-      instructions[i++] = new XorIntLit8(0, 0, 1);
+      instructions[i++] = new DexXorIntLit8(0, 0, 1);
     }
-    instructions[i] = new Return(0);
+    instructions[i] = new DexReturn(0);
     return generateCodeFromTemplate(1, 0, instructions);
   }
 
@@ -998,12 +996,12 @@
     return generateCodeFromTemplate(
         2,
         2,
-        new ConstString(0, tag),
-        new ConstString(1, message),
-        new InvokeStatic(2, logMethod, 0, 1, 0, 0, 0),
-        new NewInstance(0, exceptionType),
-        new InvokeDirect(2, exceptionInitMethod, 0, 1, 0, 0, 0),
-        new Throw(0));
+        new DexConstString(0, tag),
+        new DexConstString(1, message),
+        new DexInvokeStatic(2, logMethod, 0, 1, 0, 0, 0),
+        new DexNewInstance(0, exceptionType),
+        new DexInvokeDirect(2, exceptionInitMethod, 0, 1, 0, 0, 0),
+        new DexThrow(0));
   }
 
   private CfCode toCfCodeThatLogsError(DexItemFactory itemFactory) {
diff --git a/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java b/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java
index 55e6f8c..d2a55cb 100644
--- a/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java
+++ b/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java
@@ -4,12 +4,12 @@
 
 package com.android.tools.r8.graph;
 
-import com.android.tools.r8.code.InvokeDirect;
-import com.android.tools.r8.code.NewInstance;
-import com.android.tools.r8.code.Throw;
 import com.android.tools.r8.dex.CodeToKeep;
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.dex.MixedSectionCollection;
+import com.android.tools.r8.dex.code.DexInvokeDirect;
+import com.android.tools.r8.dex.code.DexNewInstance;
+import com.android.tools.r8.dex.code.DexThrow;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.DexCode.Try;
 import com.android.tools.r8.graph.DexCode.TryHandler;
@@ -72,7 +72,7 @@
 
   @Override
   public int codeSizeInBytes() {
-    return NewInstance.SIZE + InvokeDirect.SIZE + Throw.SIZE;
+    return DexNewInstance.SIZE + DexInvokeDirect.SIZE + DexThrow.SIZE;
   }
 
   @Override
@@ -216,14 +216,14 @@
     int register = 0;
     int notUsed = 0;
     int argumentCount = 1;
-    new NewInstance(register, exceptionType)
+    new DexNewInstance(register, exceptionType)
         .write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
     DexMethod instanceInitializer =
         lensCodeRewriter.dexItemFactory().createInstanceInitializer(exceptionType);
-    new InvokeDirect(
+    new DexInvokeDirect(
             argumentCount, instanceInitializer, register, notUsed, notUsed, notUsed, notUsed)
         .write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
-    new Throw(register).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
+    new DexThrow(register).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java b/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
index 5b02c12..b2418cb 100644
--- a/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
+++ b/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
@@ -5,11 +5,11 @@
 package com.android.tools.r8.graph;
 
 import com.android.tools.r8.cf.CfVersion;
-import com.android.tools.r8.code.Const4;
-import com.android.tools.r8.code.Throw;
 import com.android.tools.r8.dex.CodeToKeep;
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.dex.MixedSectionCollection;
+import com.android.tools.r8.dex.code.DexConst4;
+import com.android.tools.r8.dex.code.DexThrow;
 import com.android.tools.r8.graph.DexCode.Try;
 import com.android.tools.r8.graph.DexCode.TryHandler;
 import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
@@ -81,7 +81,7 @@
 
   @Override
   public int codeSizeInBytes() {
-    return Const4.SIZE + Throw.SIZE;
+    return DexConst4.SIZE + DexThrow.SIZE;
   }
 
   @Override
@@ -251,8 +251,8 @@
       LensCodeRewriterUtils lensCodeRewriter,
       ObjectToOffsetMapping mapping) {
     int register = 0;
-    new Const4(register, 0).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
-    new Throw(register).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
+    new DexConst4(register, 0).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
+    new DexThrow(register).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/graph/UseRegistry.java b/src/main/java/com/android/tools/r8/graph/UseRegistry.java
index 6e08e6c..0b066d6 100644
--- a/src/main/java/com/android/tools/r8/graph/UseRegistry.java
+++ b/src/main/java/com/android/tools/r8/graph/UseRegistry.java
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
-import com.android.tools.r8.code.CfOrDexInstanceFieldRead;
-import com.android.tools.r8.code.CfOrDexInstruction;
-import com.android.tools.r8.code.CfOrDexStaticFieldRead;
+import com.android.tools.r8.dex.code.CfOrDexInstanceFieldRead;
+import com.android.tools.r8.dex.code.CfOrDexInstruction;
+import com.android.tools.r8.dex.code.CfOrDexStaticFieldRead;
 import com.android.tools.r8.ir.code.Invoke;
 import com.android.tools.r8.utils.TraversalContinuation;
 import java.util.ListIterator;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/ComputeApiLevelOfSyntheticClass.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/ComputeApiLevelOfSyntheticClass.java
index 0faa7e9..3568c17 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/ComputeApiLevelOfSyntheticClass.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/ComputeApiLevelOfSyntheticClass.java
@@ -6,7 +6,7 @@
 
 import com.android.tools.r8.androidapi.AndroidApiLevelCompute;
 import com.android.tools.r8.androidapi.ComputedApiLevel;
-import com.android.tools.r8.code.CfOrDexInstruction;
+import com.android.tools.r8.dex.code.CfOrDexInstruction;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexCallSite;
 import com.android.tools.r8.graph.DexEncodedMethod;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java
index 0b2c884..744154c 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java
@@ -9,7 +9,7 @@
 import static com.android.tools.r8.ir.desugar.LambdaDescriptor.isLambdaMetafactoryMethod;
 import static com.android.tools.r8.utils.MapUtils.ignoreKey;
 
-import com.android.tools.r8.code.CfOrDexInstruction;
+import com.android.tools.r8.dex.code.CfOrDexInstruction;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexCallSite;
 import com.android.tools.r8.graph.DexClassAndMethod;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
index d2b1d3b..acc6daa 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
@@ -9,8 +9,8 @@
 import static com.android.tools.r8.shaking.ObjectAllocationInfoCollectionUtils.mayHaveFinalizeMethodDirectlyOrIndirectly;
 import static com.android.tools.r8.utils.MapUtils.ignoreKey;
 
-import com.android.tools.r8.code.CfOrDexInstanceFieldRead;
-import com.android.tools.r8.code.CfOrDexStaticFieldRead;
+import com.android.tools.r8.dex.code.CfOrDexInstanceFieldRead;
+import com.android.tools.r8.dex.code.CfOrDexStaticFieldRead;
 import com.android.tools.r8.graph.AbstractAccessContexts;
 import com.android.tools.r8.graph.AbstractAccessContexts.ConcreteAccessContexts;
 import com.android.tools.r8.graph.AppView;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java
index 253665f..13495c35 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java
@@ -7,7 +7,7 @@
 import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
 
 import com.android.tools.r8.androidapi.AndroidApiLevelCompute;
-import com.android.tools.r8.code.CfOrDexInstruction;
+import com.android.tools.r8.dex.code.CfOrDexInstruction;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexField;
diff --git a/src/main/java/com/android/tools/r8/ir/code/Add.java b/src/main/java/com/android/tools/r8/ir/code/Add.java
index 3a5fa32..dc8cb05 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Add.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Add.java
@@ -5,16 +5,17 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfArithmeticBinop;
-import com.android.tools.r8.code.AddDouble;
-import com.android.tools.r8.code.AddDouble2Addr;
-import com.android.tools.r8.code.AddFloat;
-import com.android.tools.r8.code.AddFloat2Addr;
-import com.android.tools.r8.code.AddInt;
-import com.android.tools.r8.code.AddInt2Addr;
-import com.android.tools.r8.code.AddIntLit16;
-import com.android.tools.r8.code.AddIntLit8;
-import com.android.tools.r8.code.AddLong;
-import com.android.tools.r8.code.AddLong2Addr;
+import com.android.tools.r8.dex.code.DexAddDouble;
+import com.android.tools.r8.dex.code.DexAddDouble2Addr;
+import com.android.tools.r8.dex.code.DexAddFloat;
+import com.android.tools.r8.dex.code.DexAddFloat2Addr;
+import com.android.tools.r8.dex.code.DexAddInt;
+import com.android.tools.r8.dex.code.DexAddInt2Addr;
+import com.android.tools.r8.dex.code.DexAddIntLit16;
+import com.android.tools.r8.dex.code.DexAddIntLit8;
+import com.android.tools.r8.dex.code.DexAddLong;
+import com.android.tools.r8.dex.code.DexAddLong2Addr;
+import com.android.tools.r8.dex.code.DexInstruction;
 
 public class Add extends ArithmeticBinop {
 
@@ -38,53 +39,53 @@
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) {
-    return new AddInt(dest, left, right);
+  public DexInstruction CreateInt(int dest, int left, int right) {
+    return new DexAddInt(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) {
-    return new AddLong(dest, left, right);
+  public DexInstruction CreateLong(int dest, int left, int right) {
+    return new DexAddLong(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateFloat(int dest, int left, int right) {
-    return new AddFloat(dest, left, right);
+  public DexInstruction CreateFloat(int dest, int left, int right) {
+    return new DexAddFloat(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateDouble(int dest, int left, int right) {
-    return new AddDouble(dest, left, right);
+  public DexInstruction CreateDouble(int dest, int left, int right) {
+    return new DexAddDouble(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) {
-    return new AddInt2Addr(left, right);
+  public DexInstruction CreateInt2Addr(int left, int right) {
+    return new DexAddInt2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) {
-    return new AddLong2Addr(left, right);
+  public DexInstruction CreateLong2Addr(int left, int right) {
+    return new DexAddLong2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateFloat2Addr(int left, int right) {
-    return new AddFloat2Addr(left, right);
+  public DexInstruction CreateFloat2Addr(int left, int right) {
+    return new DexAddFloat2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateDouble2Addr(int left, int right) {
-    return new AddDouble2Addr(left, right);
+  public DexInstruction CreateDouble2Addr(int left, int right) {
+    return new DexAddDouble2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) {
-    return new AddIntLit8(dest, left, constant);
+  public DexInstruction CreateIntLit8(int dest, int left, int constant) {
+    return new DexAddIntLit8(dest, left, constant);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) {
-    return new AddIntLit16(dest, left, constant);
+  public DexInstruction CreateIntLit16(int dest, int left, int constant) {
+    return new DexAddIntLit16(dest, left, constant);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/AlwaysMaterializingDefinition.java b/src/main/java/com/android/tools/r8/ir/code/AlwaysMaterializingDefinition.java
index ed2cdd8..7f3a0b9 100644
--- a/src/main/java/com/android/tools/r8/ir/code/AlwaysMaterializingDefinition.java
+++ b/src/main/java/com/android/tools/r8/ir/code/AlwaysMaterializingDefinition.java
@@ -4,9 +4,9 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.LoadStoreHelper;
-import com.android.tools.r8.code.Const16;
-import com.android.tools.r8.code.Const4;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexConst16;
+import com.android.tools.r8.dex.code.DexConst4;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.ir.conversion.CfBuilder;
@@ -39,7 +39,8 @@
   public void buildDex(DexBuilder builder) {
     int register = builder.allocatedRegister(outValue, getNumber());
     builder.add(
-        this, (register & 0xf) == register ? new Const4(register, 0) : new Const16(register, 0));
+        this,
+        (register & 0xf) == register ? new DexConst4(register, 0) : new DexConst16(register, 0));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/And.java b/src/main/java/com/android/tools/r8/ir/code/And.java
index 86c193b..f7aac6c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/And.java
+++ b/src/main/java/com/android/tools/r8/ir/code/And.java
@@ -5,12 +5,13 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfLogicalBinop;
-import com.android.tools.r8.code.AndInt;
-import com.android.tools.r8.code.AndInt2Addr;
-import com.android.tools.r8.code.AndIntLit16;
-import com.android.tools.r8.code.AndIntLit8;
-import com.android.tools.r8.code.AndLong;
-import com.android.tools.r8.code.AndLong2Addr;
+import com.android.tools.r8.dex.code.DexAndInt;
+import com.android.tools.r8.dex.code.DexAndInt2Addr;
+import com.android.tools.r8.dex.code.DexAndIntLit16;
+import com.android.tools.r8.dex.code.DexAndIntLit8;
+import com.android.tools.r8.dex.code.DexAndLong;
+import com.android.tools.r8.dex.code.DexAndLong2Addr;
+import com.android.tools.r8.dex.code.DexInstruction;
 import java.util.Set;
 
 public class And extends LogicalBinop {
@@ -45,33 +46,33 @@
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) {
-    return new AndInt(dest, left, right);
+  public DexInstruction CreateInt(int dest, int left, int right) {
+    return new DexAndInt(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) {
-    return new AndLong(dest, left, right);
+  public DexInstruction CreateLong(int dest, int left, int right) {
+    return new DexAndLong(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) {
-    return new AndInt2Addr(left, right);
+  public DexInstruction CreateInt2Addr(int left, int right) {
+    return new DexAndInt2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) {
-    return new AndLong2Addr(left, right);
+  public DexInstruction CreateLong2Addr(int left, int right) {
+    return new DexAndLong2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) {
-    return new AndIntLit8(dest, left, constant);
+  public DexInstruction CreateIntLit8(int dest, int left, int constant) {
+    return new DexAndIntLit8(dest, left, constant);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) {
-    return new AndIntLit16(dest, left, constant);
+  public DexInstruction CreateIntLit16(int dest, int left, int constant) {
+    return new DexAndIntLit16(dest, left, constant);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java b/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java
index a4be195..cf6039c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfArithmeticBinop;
-import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.ir.analysis.constant.Bottom;
 import com.android.tools.r8.ir.analysis.constant.ConstLatticeElement;
@@ -20,25 +20,25 @@
     super(type, dest, left, right);
   }
 
-  public abstract com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right);
+  public abstract DexInstruction CreateInt(int dest, int left, int right);
 
-  public abstract Instruction CreateLong(int dest, int left, int right);
+  public abstract DexInstruction CreateLong(int dest, int left, int right);
 
-  public abstract Instruction CreateFloat(int dest, int left, int right);
+  public abstract DexInstruction CreateFloat(int dest, int left, int right);
 
-  public abstract Instruction CreateDouble(int dest, int left, int right);
+  public abstract DexInstruction CreateDouble(int dest, int left, int right);
 
-  public abstract Instruction CreateInt2Addr(int left, int right);
+  public abstract DexInstruction CreateInt2Addr(int left, int right);
 
-  public abstract Instruction CreateLong2Addr(int left, int right);
+  public abstract DexInstruction CreateLong2Addr(int left, int right);
 
-  public abstract Instruction CreateFloat2Addr(int left, int right);
+  public abstract DexInstruction CreateFloat2Addr(int left, int right);
 
-  public abstract Instruction CreateDouble2Addr(int left, int right);
+  public abstract DexInstruction CreateDouble2Addr(int left, int right);
 
-  public abstract Instruction CreateIntLit8(int dest, int left, int constant);
+  public abstract DexInstruction CreateIntLit8(int dest, int left, int constant);
 
-  public abstract Instruction CreateIntLit16(int dest, int left, int constant);
+  public abstract DexInstruction CreateIntLit16(int dest, int left, int constant);
 
   @Override
   public boolean canBeFolded() {
@@ -64,7 +64,7 @@
     // Method needsValueInRegister ensures that left value has an allocated register.
     int left = builder.allocatedRegister(leftValue(), getNumber());
     int dest = builder.allocatedRegister(outValue, getNumber());
-    Instruction instruction = null;
+    DexInstruction instruction = null;
     if (isTwoAddr(builder.getRegisterAllocator())) {
       int right = builder.allocatedRegister(rightValue(), getNumber());
       if (left != dest) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
index 82a2ef7..2bfd3c3 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
@@ -6,14 +6,15 @@
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfArrayLoad;
-import com.android.tools.r8.code.Aget;
-import com.android.tools.r8.code.AgetBoolean;
-import com.android.tools.r8.code.AgetByte;
-import com.android.tools.r8.code.AgetChar;
-import com.android.tools.r8.code.AgetObject;
-import com.android.tools.r8.code.AgetShort;
-import com.android.tools.r8.code.AgetWide;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexAget;
+import com.android.tools.r8.dex.code.DexAgetBoolean;
+import com.android.tools.r8.dex.code.DexAgetByte;
+import com.android.tools.r8.dex.code.DexAgetChar;
+import com.android.tools.r8.dex.code.DexAgetObject;
+import com.android.tools.r8.dex.code.DexAgetShort;
+import com.android.tools.r8.dex.code.DexAgetWide;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
@@ -73,36 +74,36 @@
     int dest = builder.allocatedRegister(dest(), getNumber());
     int array = builder.allocatedRegister(array(), getNumber());
     int index = builder.allocatedRegister(index(), getNumber());
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     switch (type) {
       case INT:
       case FLOAT:
-        instruction = new Aget(dest, array, index);
+        instruction = new DexAget(dest, array, index);
         break;
       case LONG:
       case DOUBLE:
         assert builder.getOptions().canUseSameArrayAndResultRegisterInArrayGetWide()
             || dest != array;
-        instruction = new AgetWide(dest, array, index);
+        instruction = new DexAgetWide(dest, array, index);
         break;
       case OBJECT:
-        instruction = new AgetObject(dest, array, index);
+        instruction = new DexAgetObject(dest, array, index);
         break;
       case BOOLEAN_OR_BYTE:
         ArrayTypeElement arrayType = array().getType().asArrayType();
         if (arrayType != null && arrayType.getMemberType() == TypeElement.getBoolean()) {
-          instruction = new AgetBoolean(dest, array, index);
+          instruction = new DexAgetBoolean(dest, array, index);
         } else {
           assert array().getType().isDefinitelyNull()
               || arrayType.getMemberType() == TypeElement.getByte();
-          instruction = new AgetByte(dest, array, index);
+          instruction = new DexAgetByte(dest, array, index);
         }
         break;
       case CHAR:
-        instruction = new AgetChar(dest, array, index);
+        instruction = new DexAgetChar(dest, array, index);
         break;
       case SHORT:
-        instruction = new AgetShort(dest, array, index);
+        instruction = new DexAgetShort(dest, array, index);
         break;
       case INT_OR_FLOAT:
       case LONG_OR_DOUBLE:
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java b/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
index a0bf286..14837ee 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.code.CfArrayLength;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexArrayLength;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.analysis.type.TypeElement;
@@ -55,7 +56,7 @@
   public void buildDex(DexBuilder builder) {
     int dest = builder.allocatedRegister(dest(), getNumber());
     int array = builder.allocatedRegister(array(), getNumber());
-    builder.add(this, new com.android.tools.r8.code.ArrayLength(dest, array));
+    builder.add(this, new DexArrayLength(dest, array));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
index aa70b4f..4e43590 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
@@ -5,14 +5,15 @@
 
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.code.CfArrayStore;
-import com.android.tools.r8.code.Aput;
-import com.android.tools.r8.code.AputBoolean;
-import com.android.tools.r8.code.AputByte;
-import com.android.tools.r8.code.AputChar;
-import com.android.tools.r8.code.AputObject;
-import com.android.tools.r8.code.AputShort;
-import com.android.tools.r8.code.AputWide;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexAput;
+import com.android.tools.r8.dex.code.DexAputBoolean;
+import com.android.tools.r8.dex.code.DexAputByte;
+import com.android.tools.r8.dex.code.DexAputChar;
+import com.android.tools.r8.dex.code.DexAputObject;
+import com.android.tools.r8.dex.code.DexAputShort;
+import com.android.tools.r8.dex.code.DexAputWide;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.ProgramMethod;
@@ -66,34 +67,34 @@
     int value = builder.allocatedRegister(value(), getNumber());
     int array = builder.allocatedRegister(array(), getNumber());
     int index = builder.allocatedRegister(index(), getNumber());
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     switch (type) {
       case INT:
       case FLOAT:
-        instruction = new Aput(value, array, index);
+        instruction = new DexAput(value, array, index);
         break;
       case LONG:
       case DOUBLE:
-        instruction = new AputWide(value, array, index);
+        instruction = new DexAputWide(value, array, index);
         break;
       case OBJECT:
-        instruction = new AputObject(value, array, index);
+        instruction = new DexAputObject(value, array, index);
         break;
       case BOOLEAN_OR_BYTE:
         ArrayTypeElement arrayType = array().getType().asArrayType();
         if (arrayType != null && arrayType.getMemberType() == TypeElement.getBoolean()) {
-          instruction = new AputBoolean(value, array, index);
+          instruction = new DexAputBoolean(value, array, index);
         } else {
           assert array().getType().isDefinitelyNull()
               || arrayType.getMemberType() == TypeElement.getByte();
-          instruction = new AputByte(value, array, index);
+          instruction = new DexAputByte(value, array, index);
         }
         break;
       case CHAR:
-        instruction = new AputChar(value, array, index);
+        instruction = new DexAputChar(value, array, index);
         break;
       case SHORT:
-        instruction = new AputShort(value, array, index);
+        instruction = new DexAputShort(value, array, index);
         break;
       case INT_OR_FLOAT:
       case LONG_OR_DOUBLE:
diff --git a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
index 5e96f46..ea014e6 100644
--- a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
+++ b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
@@ -9,9 +9,10 @@
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfCheckCast;
-import com.android.tools.r8.code.MoveObject;
-import com.android.tools.r8.code.MoveObjectFrom16;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexCheckCast;
+import com.android.tools.r8.dex.code.DexMoveObject;
+import com.android.tools.r8.dex.code.DexMoveObjectFrom16;
 import com.android.tools.r8.graph.AccessControl;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
@@ -107,18 +108,18 @@
       if (inRegister == outRegister) {
         builder.add(this, createCheckCast(outRegister));
       } else {
-        com.android.tools.r8.code.CheckCast cast = createCheckCast(outRegister);
+        DexCheckCast cast = createCheckCast(outRegister);
         if (outRegister <= Constants.U4BIT_MAX && inRegister <= Constants.U4BIT_MAX) {
-          builder.add(this, new MoveObject(outRegister, inRegister), cast);
+          builder.add(this, new DexMoveObject(outRegister, inRegister), cast);
         } else {
-          builder.add(this, new MoveObjectFrom16(outRegister, inRegister), cast);
+          builder.add(this, new DexMoveObjectFrom16(outRegister, inRegister), cast);
         }
       }
     }
   }
 
-  com.android.tools.r8.code.CheckCast createCheckCast(int register) {
-    return new com.android.tools.r8.code.CheckCast(register, getType(), ignoreCompatRules());
+  DexCheckCast createCheckCast(int register) {
+    return new DexCheckCast(register, getType(), ignoreCompatRules());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Cmp.java b/src/main/java/com/android/tools/r8/ir/code/Cmp.java
index a7b25a3..a03637e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Cmp.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Cmp.java
@@ -4,12 +4,13 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfCmp;
-import com.android.tools.r8.code.CmpLong;
-import com.android.tools.r8.code.CmpgDouble;
-import com.android.tools.r8.code.CmpgFloat;
-import com.android.tools.r8.code.CmplDouble;
-import com.android.tools.r8.code.CmplFloat;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexCmpLong;
+import com.android.tools.r8.dex.code.DexCmpgDouble;
+import com.android.tools.r8.dex.code.DexCmpgFloat;
+import com.android.tools.r8.dex.code.DexCmplDouble;
+import com.android.tools.r8.dex.code.DexCmplFloat;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.ir.analysis.constant.Bottom;
@@ -53,7 +54,7 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int dest = builder.allocatedRegister(outValue, getNumber());
     int left = builder.allocatedRegister(leftValue(), getNumber());
     int right = builder.allocatedRegister(rightValue(), getNumber());
@@ -61,24 +62,24 @@
       case DOUBLE:
         assert bias != Bias.NONE;
         if (bias == Bias.GT) {
-          instruction = new CmpgDouble(dest, left, right);
+          instruction = new DexCmpgDouble(dest, left, right);
         } else {
           assert bias == Bias.LT;
-          instruction = new CmplDouble(dest, left, right);
+          instruction = new DexCmplDouble(dest, left, right);
         }
         break;
       case FLOAT:
         assert bias != Bias.NONE;
         if (bias == Bias.GT) {
-          instruction = new CmpgFloat(dest, left, right);
+          instruction = new DexCmpgFloat(dest, left, right);
         } else {
           assert bias == Bias.LT;
-          instruction = new CmplFloat(dest, left, right);
+          instruction = new DexCmplFloat(dest, left, right);
         }
         break;
       case LONG:
         assert bias == Bias.NONE;
-        instruction = new CmpLong(dest, left, right);
+        instruction = new DexCmpLong(dest, left, right);
         break;
       default:
         throw new Unreachable("Unexpected type " + type);
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
index 05869bb..1fd0fed 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfConstClass;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexConstClass;
 import com.android.tools.r8.graph.AccessControl;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
@@ -79,7 +80,7 @@
   @Override
   public void buildDex(DexBuilder builder) {
     int dest = builder.allocatedRegister(dest(), getNumber());
-    builder.add(this, new com.android.tools.r8.code.ConstClass(dest, clazz, ignoreCompatRules()));
+    builder.add(this, new DexConstClass(dest, clazz, ignoreCompatRules()));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java b/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java
index 35cef20..78ee74e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfConstMethodHandle;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexConstMethodHandle;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexMethodHandle;
 import com.android.tools.r8.graph.DexType;
@@ -58,7 +59,7 @@
   @Override
   public void buildDex(DexBuilder builder) {
     int dest = builder.allocatedRegister(dest(), getNumber());
-    builder.add(this, new com.android.tools.r8.code.ConstMethodHandle(dest, methodHandle));
+    builder.add(this, new DexConstMethodHandle(dest, methodHandle));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java b/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
index 64359c8..5ce3e31 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfConstMethodType;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexConstMethodType;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexType;
@@ -58,7 +59,7 @@
   @Override
   public void buildDex(DexBuilder builder) {
     int dest = builder.allocatedRegister(dest(), getNumber());
-    builder.add(this, new com.android.tools.r8.code.ConstMethodType(dest, methodType));
+    builder.add(this, new DexConstMethodType(dest, methodType));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
index 958816b..8d39b43 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
@@ -7,15 +7,15 @@
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfConstNull;
 import com.android.tools.r8.cf.code.CfConstNumber;
-import com.android.tools.r8.code.Const;
-import com.android.tools.r8.code.Const16;
-import com.android.tools.r8.code.Const4;
-import com.android.tools.r8.code.ConstHigh16;
-import com.android.tools.r8.code.ConstWide;
-import com.android.tools.r8.code.ConstWide16;
-import com.android.tools.r8.code.ConstWide32;
-import com.android.tools.r8.code.ConstWideHigh16;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexConst;
+import com.android.tools.r8.dex.code.DexConst16;
+import com.android.tools.r8.dex.code.DexConst4;
+import com.android.tools.r8.dex.code.DexConstHigh16;
+import com.android.tools.r8.dex.code.DexConstWide;
+import com.android.tools.r8.dex.code.DexConstWide16;
+import com.android.tools.r8.dex.code.DexConstWide32;
+import com.android.tools.r8.dex.code.DexConstWideHigh16;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexType;
@@ -143,24 +143,24 @@
     if (outType().isObject() || outType().isSingle()) {
       assert NumberUtils.is32Bit(value);
       if ((register & 0xf) == register && NumberUtils.is4Bit(value)) {
-        builder.add(this, new Const4(register, (int) value));
+        builder.add(this, new DexConst4(register, (int) value));
       } else if (NumberUtils.is16Bit(value)) {
-        builder.add(this, new Const16(register, (int) value));
+        builder.add(this, new DexConst16(register, (int) value));
       } else if ((value & 0x0000ffffL) == 0) {
-        builder.add(this, new ConstHigh16(register, ((int) value) >>> 16));
+        builder.add(this, new DexConstHigh16(register, ((int) value) >>> 16));
       } else {
-        builder.add(this, new Const(register, (int) value));
+        builder.add(this, new DexConst(register, (int) value));
       }
     } else {
       assert outType().isWide();
       if (NumberUtils.is16Bit(value)) {
-        builder.add(this, new ConstWide16(register, (int) value));
+        builder.add(this, new DexConstWide16(register, (int) value));
       } else if ((value & 0x0000ffffffffffffL) == 0) {
-        builder.add(this, new ConstWideHigh16(register, (int) (value >>> 48)));
+        builder.add(this, new DexConstWideHigh16(register, (int) (value >>> 48)));
       } else if (NumberUtils.is32Bit(value)) {
-        builder.add(this, new ConstWide32(register, (int) value));
+        builder.add(this, new DexConstWide32(register, (int) value));
       } else {
-        builder.add(this, new ConstWide(register, value));
+        builder.add(this, new DexConstWide(register, value));
       }
     }
   }
@@ -222,24 +222,24 @@
     if (type.isSingle()) {
       assert NumberUtils.is32Bit(value);
       if (NumberUtils.is4Bit(value)) {
-        return Const4.SIZE;
+        return DexConst4.SIZE;
       } else if (NumberUtils.is16Bit(value)) {
-        return Const16.SIZE;
+        return DexConst16.SIZE;
       } else if ((value & 0x0000ffffL) == 0) {
-        return ConstHigh16.SIZE;
+        return DexConstHigh16.SIZE;
       } else {
-        return Const.SIZE;
+        return DexConst.SIZE;
       }
     } else {
       assert type.isWide();
       if (NumberUtils.is16Bit(value)) {
-        return ConstWide16.SIZE;
+        return DexConstWide16.SIZE;
       } else if ((value & 0x0000ffffffffffffL) == 0) {
-        return ConstWideHigh16.SIZE;
+        return DexConstWideHigh16.SIZE;
       } else if (NumberUtils.is32Bit(value)) {
-        return ConstWide32.SIZE;
+        return DexConstWide32.SIZE;
       } else {
-        return ConstWide.SIZE;
+        return DexConstWide.SIZE;
       }
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstString.java b/src/main/java/com/android/tools/r8/ir/code/ConstString.java
index 3df5d13..ca71070 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstString.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstString.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfConstString;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexConstString;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexString;
@@ -69,7 +70,7 @@
   @Override
   public void buildDex(DexBuilder builder) {
     int dest = builder.allocatedRegister(dest(), getNumber());
-    builder.add(this, new com.android.tools.r8.code.ConstString(dest, value));
+    builder.add(this, new DexConstString(dest, value));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java b/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
index b7820c1..78a582b 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
@@ -83,7 +83,7 @@
     int dest = builder.allocatedRegister(outValue(), getNumber());
     builder.add(
         this,
-        new com.android.tools.r8.code.DexItemBasedConstString(dest, item, nameComputationInfo));
+        new com.android.tools.r8.dex.code.DexItemBasedConstString(dest, item, nameComputationInfo));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Div.java b/src/main/java/com/android/tools/r8/ir/code/Div.java
index 45a743f..21031fb 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Div.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Div.java
@@ -4,16 +4,17 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfArithmeticBinop;
-import com.android.tools.r8.code.DivDouble;
-import com.android.tools.r8.code.DivDouble2Addr;
-import com.android.tools.r8.code.DivFloat;
-import com.android.tools.r8.code.DivFloat2Addr;
-import com.android.tools.r8.code.DivInt;
-import com.android.tools.r8.code.DivInt2Addr;
-import com.android.tools.r8.code.DivIntLit16;
-import com.android.tools.r8.code.DivIntLit8;
-import com.android.tools.r8.code.DivLong;
-import com.android.tools.r8.code.DivLong2Addr;
+import com.android.tools.r8.dex.code.DexDivDouble;
+import com.android.tools.r8.dex.code.DexDivDouble2Addr;
+import com.android.tools.r8.dex.code.DexDivFloat;
+import com.android.tools.r8.dex.code.DexDivFloat2Addr;
+import com.android.tools.r8.dex.code.DexDivInt;
+import com.android.tools.r8.dex.code.DexDivInt2Addr;
+import com.android.tools.r8.dex.code.DexDivIntLit16;
+import com.android.tools.r8.dex.code.DexDivIntLit8;
+import com.android.tools.r8.dex.code.DexDivLong;
+import com.android.tools.r8.dex.code.DexDivLong2Addr;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.ir.analysis.constant.Bottom;
 import com.android.tools.r8.ir.analysis.constant.LatticeElement;
 import java.util.function.Function;
@@ -50,53 +51,53 @@
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) {
-    return new DivInt(dest, left, right);
+  public DexInstruction CreateInt(int dest, int left, int right) {
+    return new DexDivInt(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) {
-    return new DivLong(dest, left, right);
+  public DexInstruction CreateLong(int dest, int left, int right) {
+    return new DexDivLong(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateFloat(int dest, int left, int right) {
-    return new DivFloat(dest, left, right);
+  public DexInstruction CreateFloat(int dest, int left, int right) {
+    return new DexDivFloat(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateDouble(int dest, int left, int right) {
-    return new DivDouble(dest, left, right);
+  public DexInstruction CreateDouble(int dest, int left, int right) {
+    return new DexDivDouble(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) {
-    return new DivInt2Addr(left, right);
+  public DexInstruction CreateInt2Addr(int left, int right) {
+    return new DexDivInt2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) {
-    return new DivLong2Addr(left, right);
+  public DexInstruction CreateLong2Addr(int left, int right) {
+    return new DexDivLong2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateFloat2Addr(int left, int right) {
-    return new DivFloat2Addr(left, right);
+  public DexInstruction CreateFloat2Addr(int left, int right) {
+    return new DexDivFloat2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateDouble2Addr(int left, int right) {
-    return new DivDouble2Addr(left, right);
+  public DexInstruction CreateDouble2Addr(int left, int right) {
+    return new DexDivDouble2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) {
-    return new DivIntLit8(dest, left, constant);
+  public DexInstruction CreateIntLit8(int dest, int left, int constant) {
+    return new DexDivIntLit8(dest, left, constant);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) {
-    return new DivIntLit16(dest, left, constant);
+  public DexInstruction CreateIntLit16(int dest, int left, int constant) {
+    return new DexDivIntLit16(dest, left, constant);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/InitClass.java b/src/main/java/com/android/tools/r8/ir/code/InitClass.java
index 80351a6..f331383 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InitClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InitClass.java
@@ -6,8 +6,8 @@
 
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.code.CfInitClass;
-import com.android.tools.r8.code.DexInitClass;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexInitClass;
 import com.android.tools.r8.graph.AccessControl;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
index 0bc0830..b88555d 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
@@ -7,14 +7,15 @@
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfInstanceFieldRead;
-import com.android.tools.r8.code.Iget;
-import com.android.tools.r8.code.IgetBoolean;
-import com.android.tools.r8.code.IgetByte;
-import com.android.tools.r8.code.IgetChar;
-import com.android.tools.r8.code.IgetObject;
-import com.android.tools.r8.code.IgetShort;
-import com.android.tools.r8.code.IgetWide;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexIget;
+import com.android.tools.r8.dex.code.DexIgetBoolean;
+import com.android.tools.r8.dex.code.DexIgetByte;
+import com.android.tools.r8.dex.code.DexIgetChar;
+import com.android.tools.r8.dex.code.DexIgetObject;
+import com.android.tools.r8.dex.code.DexIgetShort;
+import com.android.tools.r8.dex.code.DexIgetWide;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexField;
@@ -79,31 +80,31 @@
   public void buildDex(DexBuilder builder) {
     int destRegister = builder.allocatedRegister(dest(), getNumber());
     int objectRegister = builder.allocatedRegister(object(), getNumber());
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     DexField field = getField();
     switch (getType()) {
       case INT:
       case FLOAT:
-        instruction = new Iget(destRegister, objectRegister, field);
+        instruction = new DexIget(destRegister, objectRegister, field);
         break;
       case LONG:
       case DOUBLE:
-        instruction = new IgetWide(destRegister, objectRegister, field);
+        instruction = new DexIgetWide(destRegister, objectRegister, field);
         break;
       case OBJECT:
-        instruction = new IgetObject(destRegister, objectRegister, field);
+        instruction = new DexIgetObject(destRegister, objectRegister, field);
         break;
       case BOOLEAN:
-        instruction = new IgetBoolean(destRegister, objectRegister, field);
+        instruction = new DexIgetBoolean(destRegister, objectRegister, field);
         break;
       case BYTE:
-        instruction = new IgetByte(destRegister, objectRegister, field);
+        instruction = new DexIgetByte(destRegister, objectRegister, field);
         break;
       case CHAR:
-        instruction = new IgetChar(destRegister, objectRegister, field);
+        instruction = new DexIgetChar(destRegister, objectRegister, field);
         break;
       case SHORT:
-        instruction = new IgetShort(destRegister, objectRegister, field);
+        instruction = new DexIgetShort(destRegister, objectRegister, field);
         break;
       default:
         throw new Unreachable("Unexpected type: " + getType());
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
index 123eb45..4af4442 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.code.CfInstanceOf;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexInstanceOf;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.ProgramMethod;
@@ -52,7 +53,7 @@
   public void buildDex(DexBuilder builder) {
     int dest = builder.allocatedRegister(dest(), getNumber());
     int value = builder.allocatedRegister(value(), getNumber());
-    builder.addInstanceOf(this, new com.android.tools.r8.code.InstanceOf(dest, value, type));
+    builder.addInstanceOf(this, new DexInstanceOf(dest, value, type));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
index 68d7ffc..be3739e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
@@ -6,14 +6,15 @@
 
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.code.CfInstanceFieldWrite;
-import com.android.tools.r8.code.Iput;
-import com.android.tools.r8.code.IputBoolean;
-import com.android.tools.r8.code.IputByte;
-import com.android.tools.r8.code.IputChar;
-import com.android.tools.r8.code.IputObject;
-import com.android.tools.r8.code.IputShort;
-import com.android.tools.r8.code.IputWide;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexIput;
+import com.android.tools.r8.dex.code.DexIputBoolean;
+import com.android.tools.r8.dex.code.DexIputByte;
+import com.android.tools.r8.dex.code.DexIputChar;
+import com.android.tools.r8.dex.code.DexIputObject;
+import com.android.tools.r8.dex.code.DexIputShort;
+import com.android.tools.r8.dex.code.DexIputWide;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexEncodedField;
@@ -87,33 +88,33 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int valueRegister = builder.allocatedRegister(value(), getNumber());
     int objectRegister = builder.allocatedRegister(object(), getNumber());
     DexField field = getField();
     switch (getType()) {
       case INT:
       case FLOAT:
-        instruction = new Iput(valueRegister, objectRegister, field);
+        instruction = new DexIput(valueRegister, objectRegister, field);
         break;
       case LONG:
       case DOUBLE:
-        instruction = new IputWide(valueRegister, objectRegister, field);
+        instruction = new DexIputWide(valueRegister, objectRegister, field);
         break;
       case OBJECT:
-        instruction = new IputObject(valueRegister, objectRegister, field);
+        instruction = new DexIputObject(valueRegister, objectRegister, field);
         break;
       case BOOLEAN:
-        instruction = new IputBoolean(valueRegister, objectRegister, field);
+        instruction = new DexIputBoolean(valueRegister, objectRegister, field);
         break;
       case BYTE:
-        instruction = new IputByte(valueRegister, objectRegister, field);
+        instruction = new DexIputByte(valueRegister, objectRegister, field);
         break;
       case CHAR:
-        instruction = new IputChar(valueRegister, objectRegister, field);
+        instruction = new DexIputChar(valueRegister, objectRegister, field);
         break;
       case SHORT:
-        instruction = new IputShort(valueRegister, objectRegister, field);
+        instruction = new DexIputShort(valueRegister, objectRegister, field);
         break;
       default:
         throw new Unreachable("Unexpected type: " + getType());
diff --git a/src/main/java/com/android/tools/r8/ir/code/IntSwitch.java b/src/main/java/com/android/tools/r8/ir/code/IntSwitch.java
index 601f67f..9ccd91e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IntSwitch.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IntSwitch.java
@@ -8,12 +8,12 @@
 import com.android.tools.r8.cf.code.CfLabel;
 import com.android.tools.r8.cf.code.CfSwitch;
 import com.android.tools.r8.cf.code.CfSwitch.Kind;
-import com.android.tools.r8.code.Nop;
-import com.android.tools.r8.code.PackedSwitch;
-import com.android.tools.r8.code.PackedSwitchPayload;
-import com.android.tools.r8.code.SparseSwitch;
-import com.android.tools.r8.code.SparseSwitchPayload;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexNop;
+import com.android.tools.r8.dex.code.DexPackedSwitch;
+import com.android.tools.r8.dex.code.DexPackedSwitchPayload;
+import com.android.tools.r8.dex.code.DexSparseSwitch;
+import com.android.tools.r8.dex.code.DexSparseSwitchPayload;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.ir.conversion.CfBuilder;
 import com.android.tools.r8.ir.conversion.DexBuilder;
@@ -202,9 +202,9 @@
   public void buildDex(DexBuilder builder) {
     int value = builder.allocatedRegister(value(), getNumber());
     if (emitPacked(InternalOutputMode.DexIndexed)) {
-      builder.addSwitch(this, new PackedSwitch(value));
+      builder.addSwitch(this, new DexPackedSwitch(value));
     } else {
-      builder.addSwitch(this, new SparseSwitch(value));
+      builder.addSwitch(this, new DexSparseSwitch(value));
     }
   }
 
@@ -224,14 +224,14 @@
     return result;
   }
 
-  public Nop buildPayload(int[] targets, int fallthroughTarget, InternalOutputMode mode) {
+  public DexNop buildPayload(int[] targets, int fallthroughTarget, InternalOutputMode mode) {
     assert keys.length == targets.length;
     assert mode.isGeneratingDex();
     if (emitPacked(mode)) {
       int targetsCount = (int) numberOfTargetsIfPacked(keys);
       if (targets.length == targetsCount) {
         // All targets are already present.
-        return new PackedSwitchPayload(getFirstKey(), targets);
+        return new DexPackedSwitchPayload(getFirstKey(), targets);
       } else {
         // Generate the list of targets for all key values. Set the target for keys not present
         // to the fallthrough.
@@ -247,11 +247,11 @@
           }
         }
         assert originalIndex == keys.length;
-        return new PackedSwitchPayload(getFirstKey(), packedTargets);
+        return new DexPackedSwitchPayload(getFirstKey(), packedTargets);
       }
     } else {
       assert numberOfKeys() == keys.length;
-      return new SparseSwitchPayload(keys, targets);
+      return new DexSparseSwitchPayload(keys, targets);
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/Invoke.java b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
index 9e6d8a6..786a73e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Invoke.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
@@ -3,17 +3,26 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.code;
 
-import com.android.tools.r8.code.InvokeCustomRange;
-import com.android.tools.r8.code.InvokeDirectRange;
-import com.android.tools.r8.code.InvokeInterfaceRange;
-import com.android.tools.r8.code.InvokePolymorphicRange;
-import com.android.tools.r8.code.InvokeStaticRange;
-import com.android.tools.r8.code.InvokeSuperRange;
-import com.android.tools.r8.code.InvokeVirtualRange;
-import com.android.tools.r8.code.MoveResult;
-import com.android.tools.r8.code.MoveResultObject;
-import com.android.tools.r8.code.MoveResultWide;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeCustom;
+import com.android.tools.r8.dex.code.DexInvokeCustomRange;
+import com.android.tools.r8.dex.code.DexInvokeDirect;
+import com.android.tools.r8.dex.code.DexInvokeDirectRange;
+import com.android.tools.r8.dex.code.DexInvokeInterface;
+import com.android.tools.r8.dex.code.DexInvokeInterfaceRange;
+import com.android.tools.r8.dex.code.DexInvokePolymorphic;
+import com.android.tools.r8.dex.code.DexInvokePolymorphicRange;
+import com.android.tools.r8.dex.code.DexInvokeStatic;
+import com.android.tools.r8.dex.code.DexInvokeStaticRange;
+import com.android.tools.r8.dex.code.DexInvokeSuper;
+import com.android.tools.r8.dex.code.DexInvokeSuperRange;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
+import com.android.tools.r8.dex.code.DexInvokeVirtualRange;
+import com.android.tools.r8.dex.code.DexMoveResult;
+import com.android.tools.r8.dex.code.DexMoveResultObject;
+import com.android.tools.r8.dex.code.DexMoveResultWide;
+import com.android.tools.r8.dex.code.DexNewArray;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClassAndMethod;
@@ -39,15 +48,15 @@
   private static final int NO_SUCH_DEX_INSTRUCTION = -1;
 
   public enum Type {
-    DIRECT(com.android.tools.r8.code.InvokeDirect.OPCODE, InvokeDirectRange.OPCODE),
-    INTERFACE(com.android.tools.r8.code.InvokeInterface.OPCODE, InvokeInterfaceRange.OPCODE),
-    STATIC(com.android.tools.r8.code.InvokeStatic.OPCODE, InvokeStaticRange.OPCODE),
-    SUPER(com.android.tools.r8.code.InvokeSuper.OPCODE, InvokeSuperRange.OPCODE),
-    VIRTUAL(com.android.tools.r8.code.InvokeVirtual.OPCODE, InvokeVirtualRange.OPCODE),
-    NEW_ARRAY(com.android.tools.r8.code.NewArray.OPCODE, NO_SUCH_DEX_INSTRUCTION),
+    DIRECT(DexInvokeDirect.OPCODE, DexInvokeDirectRange.OPCODE),
+    INTERFACE(DexInvokeInterface.OPCODE, DexInvokeInterfaceRange.OPCODE),
+    STATIC(DexInvokeStatic.OPCODE, DexInvokeStaticRange.OPCODE),
+    SUPER(DexInvokeSuper.OPCODE, DexInvokeSuperRange.OPCODE),
+    VIRTUAL(DexInvokeVirtual.OPCODE, DexInvokeVirtualRange.OPCODE),
+    NEW_ARRAY(DexNewArray.OPCODE, NO_SUCH_DEX_INSTRUCTION),
     MULTI_NEW_ARRAY(NO_SUCH_DEX_INSTRUCTION, NO_SUCH_DEX_INSTRUCTION),
-    CUSTOM(com.android.tools.r8.code.InvokeCustom.OPCODE, InvokeCustomRange.OPCODE),
-    POLYMORPHIC(com.android.tools.r8.code.InvokePolymorphic.OPCODE, InvokePolymorphicRange.OPCODE);
+    CUSTOM(DexInvokeCustom.OPCODE, DexInvokeCustomRange.OPCODE),
+    POLYMORPHIC(DexInvokePolymorphic.OPCODE, DexInvokePolymorphicRange.OPCODE);
 
     private final int dexOpcode;
     private final int dexOpcodeRange;
@@ -346,18 +355,17 @@
     return true;
   }
 
-  protected void addInvokeAndMoveResult(
-      com.android.tools.r8.code.Instruction instruction, DexBuilder builder) {
+  protected void addInvokeAndMoveResult(DexInstruction instruction, DexBuilder builder) {
     if (outValue != null && outValue.needsRegister()) {
       TypeElement moveType = outValue.getType();
       int register = builder.allocatedRegister(outValue, getNumber());
-      com.android.tools.r8.code.Instruction moveResult;
+      DexInstruction moveResult;
       if (moveType.isSinglePrimitive()) {
-        moveResult = new MoveResult(register);
+        moveResult = new DexMoveResult(register);
       } else if (moveType.isWidePrimitive()) {
-        moveResult = new MoveResultWide(register);
+        moveResult = new DexMoveResultWide(register);
       } else if (moveType.isReferenceType()) {
-        moveResult = new MoveResultObject(register);
+        moveResult = new DexMoveResultObject(register);
       } else {
         throw new Unreachable("Unexpected result type " + outType());
       }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
index 1296742..e43b0f0 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
@@ -6,7 +6,9 @@
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfInvokeDynamic;
-import com.android.tools.r8.code.InvokeCustomRange;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeCustom;
+import com.android.tools.r8.dex.code.DexInvokeCustomRange;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexCallSite;
 import com.android.tools.r8.graph.DexType;
@@ -123,24 +125,25 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int argumentRegisters = requiredArgumentRegisters();
     builder.requestOutgoingRegisters(argumentRegisters);
     if (needsRangedInvoke(builder)) {
       assert argumentsConsecutive(builder);
       int firstRegister = argumentRegisterValue(0, builder);
-      instruction = new InvokeCustomRange(firstRegister, argumentRegisters, getCallSite());
+      instruction = new DexInvokeCustomRange(firstRegister, argumentRegisters, getCallSite());
     } else {
       int[] individualArgumentRegisters = new int[5];
       int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters);
-      instruction = new com.android.tools.r8.code.InvokeCustom(
-          argumentRegistersCount,
-          getCallSite(),
-          individualArgumentRegisters[0], // C
-          individualArgumentRegisters[1], // D
-          individualArgumentRegisters[2], // E
-          individualArgumentRegisters[3], // F
-          individualArgumentRegisters[4]); // G
+      instruction =
+          new DexInvokeCustom(
+              argumentRegistersCount,
+              getCallSite(),
+              individualArgumentRegisters[0], // C
+              individualArgumentRegisters[1], // D
+              individualArgumentRegisters[2], // E
+              individualArgumentRegisters[3], // F
+              individualArgumentRegisters[4]); // G
     }
     addInvokeAndMoveResult(instruction, builder);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java b/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
index f57b79f..ff70fed 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
@@ -6,8 +6,10 @@
 import static com.android.tools.r8.graph.DexEncodedMethod.asDexClassAndMethodOrNull;
 
 import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.code.InvokeDirectRange;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeDirect;
+import com.android.tools.r8.dex.code.DexInvokeDirectRange;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexEncodedMethod;
@@ -76,24 +78,25 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int argumentRegisters = requiredArgumentRegisters();
     builder.requestOutgoingRegisters(argumentRegisters);
     if (needsRangedInvoke(builder)) {
       assert argumentsConsecutive(builder);
       int firstRegister = argumentRegisterValue(0, builder);
-      instruction = new InvokeDirectRange(firstRegister, argumentRegisters, getInvokedMethod());
+      instruction = new DexInvokeDirectRange(firstRegister, argumentRegisters, getInvokedMethod());
     } else {
       int[] individualArgumentRegisters = new int[5];
       int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters);
-      instruction = new com.android.tools.r8.code.InvokeDirect(
-          argumentRegistersCount,
-          getInvokedMethod(),
-          individualArgumentRegisters[0],  // C
-          individualArgumentRegisters[1],  // D
-          individualArgumentRegisters[2],  // E
-          individualArgumentRegisters[3],  // F
-          individualArgumentRegisters[4]); // G
+      instruction =
+          new DexInvokeDirect(
+              argumentRegistersCount,
+              getInvokedMethod(),
+              individualArgumentRegisters[0], // C
+              individualArgumentRegisters[1], // D
+              individualArgumentRegisters[2], // E
+              individualArgumentRegisters[3], // F
+              individualArgumentRegisters[4]); // G
     }
     addInvokeAndMoveResult(instruction, builder);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java b/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java
index 6749695..67e78d6 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java
@@ -6,7 +6,9 @@
 import static com.android.tools.r8.graph.DexEncodedMethod.asDexClassAndMethodOrNull;
 
 import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.code.InvokeInterfaceRange;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeInterface;
+import com.android.tools.r8.dex.code.DexInvokeInterfaceRange;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexEncodedMethod;
@@ -57,24 +59,26 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int argumentRegisters = requiredArgumentRegisters();
     builder.requestOutgoingRegisters(argumentRegisters);
     if (needsRangedInvoke(builder)) {
       assert argumentsConsecutive(builder);
       int firstRegister = argumentRegisterValue(0, builder);
-      instruction = new InvokeInterfaceRange(firstRegister, argumentRegisters, getInvokedMethod());
+      instruction =
+          new DexInvokeInterfaceRange(firstRegister, argumentRegisters, getInvokedMethod());
     } else {
       int[] individualArgumentRegisters = new int[5];
       int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters);
-      instruction = new com.android.tools.r8.code.InvokeInterface(
-          argumentRegistersCount,
-          getInvokedMethod(),
-          individualArgumentRegisters[0],  // C
-          individualArgumentRegisters[1],  // D
-          individualArgumentRegisters[2],  // E
-          individualArgumentRegisters[3],  // F
-          individualArgumentRegisters[4]); // G
+      instruction =
+          new DexInvokeInterface(
+              argumentRegistersCount,
+              getInvokedMethod(),
+              individualArgumentRegisters[0], // C
+              individualArgumentRegisters[1], // D
+              individualArgumentRegisters[2], // E
+              individualArgumentRegisters[3], // F
+              individualArgumentRegisters[4]); // G
     }
     addInvokeAndMoveResult(instruction, builder);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
index 1b356e3..9bc1728 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
@@ -5,8 +5,9 @@
 
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.TypeVerificationHelper;
-import com.android.tools.r8.code.FilledNewArray;
-import com.android.tools.r8.code.FilledNewArrayRange;
+import com.android.tools.r8.dex.code.DexFilledNewArray;
+import com.android.tools.r8.dex.code.DexFilledNewArrayRange;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AccessControl;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
@@ -70,24 +71,25 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int argumentRegisters = requiredArgumentRegisters();
     builder.requestOutgoingRegisters(argumentRegisters);
     if (needsRangedInvoke(builder)) {
       assert argumentsConsecutive(builder);
       int firstRegister = argumentRegisterValue(0, builder);
-      instruction = new FilledNewArrayRange(firstRegister, argumentRegisters, type);
+      instruction = new DexFilledNewArrayRange(firstRegister, argumentRegisters, type);
     } else {
       int[] individualArgumentRegisters = new int[5];
       int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters);
-      instruction = new FilledNewArray(
-          argumentRegistersCount,
-          type,
-          individualArgumentRegisters[0],  // C
-          individualArgumentRegisters[1],  // D
-          individualArgumentRegisters[2],  // E
-          individualArgumentRegisters[3],  // F
-          individualArgumentRegisters[4]); // G
+      instruction =
+          new DexFilledNewArray(
+              argumentRegistersCount,
+              type,
+              individualArgumentRegisters[0], // C
+              individualArgumentRegisters[1], // D
+              individualArgumentRegisters[2], // E
+              individualArgumentRegisters[3], // F
+              individualArgumentRegisters[4]); // G
     }
     addInvokeAndMoveResult(instruction, builder);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java b/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java
index ad8c087..c09c441 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java
@@ -4,7 +4,9 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.code.InvokePolymorphicRange;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokePolymorphic;
+import com.android.tools.r8.dex.code.DexInvokePolymorphicRange;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClassAndMethod;
@@ -71,18 +73,20 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int argumentRegisters = requiredArgumentRegisters();
     builder.requestOutgoingRegisters(argumentRegisters);
     if (needsRangedInvoke(builder)) {
       assert argumentsConsecutive(builder);
       int firstRegister = argumentRegisterValue(0, builder);
-      instruction = new InvokePolymorphicRange(
+      instruction =
+          new DexInvokePolymorphicRange(
               firstRegister, argumentRegisters, getInvokedMethod(), getProto());
     } else {
       int[] individualArgumentRegisters = new int[5];
       int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters);
-      instruction = new com.android.tools.r8.code.InvokePolymorphic(
+      instruction =
+          new DexInvokePolymorphic(
               argumentRegistersCount,
               getInvokedMethod(),
               getProto(),
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
index b405dbb..8f47b31 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
@@ -6,7 +6,9 @@
 import static com.android.tools.r8.graph.DexEncodedMethod.asDexClassAndMethodOrNull;
 
 import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.code.InvokeStaticRange;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeStatic;
+import com.android.tools.r8.dex.code.DexInvokeStaticRange;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMethod;
@@ -74,24 +76,25 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int argumentRegisters = requiredArgumentRegisters();
     builder.requestOutgoingRegisters(argumentRegisters);
     if (needsRangedInvoke(builder)) {
       assert argumentsConsecutive(builder);
       int firstRegister = argumentRegisterValue(0, builder);
-      instruction = new InvokeStaticRange(firstRegister, argumentRegisters, getInvokedMethod());
+      instruction = new DexInvokeStaticRange(firstRegister, argumentRegisters, getInvokedMethod());
     } else {
       int[] individualArgumentRegisters = new int[5];
       int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters);
-      instruction = new com.android.tools.r8.code.InvokeStatic(
-          argumentRegistersCount,
-          getInvokedMethod(),
-          individualArgumentRegisters[0],  // C
-          individualArgumentRegisters[1],  // D
-          individualArgumentRegisters[2],  // E
-          individualArgumentRegisters[3],  // F
-          individualArgumentRegisters[4]); // G
+      instruction =
+          new DexInvokeStatic(
+              argumentRegistersCount,
+              getInvokedMethod(),
+              individualArgumentRegisters[0], // C
+              individualArgumentRegisters[1], // D
+              individualArgumentRegisters[2], // E
+              individualArgumentRegisters[3], // F
+              individualArgumentRegisters[4]); // G
     }
     addInvokeAndMoveResult(instruction, builder);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
index d41559e..705c7f9 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
@@ -5,7 +5,9 @@
 
 
 import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.code.InvokeSuperRange;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeSuper;
+import com.android.tools.r8.dex.code.DexInvokeSuperRange;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexMethod;
@@ -58,24 +60,25 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int argumentRegisters = requiredArgumentRegisters();
     builder.requestOutgoingRegisters(argumentRegisters);
     if (needsRangedInvoke(builder)) {
       assert argumentsConsecutive(builder);
       int firstRegister = argumentRegisterValue(0, builder);
-      instruction = new InvokeSuperRange(firstRegister, argumentRegisters, getInvokedMethod());
+      instruction = new DexInvokeSuperRange(firstRegister, argumentRegisters, getInvokedMethod());
     } else {
       int[] individualArgumentRegisters = new int[5];
       int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters);
-      instruction = new com.android.tools.r8.code.InvokeSuper(
-          argumentRegistersCount,
-          getInvokedMethod(),
-          individualArgumentRegisters[0],  // C
-          individualArgumentRegisters[1],  // D
-          individualArgumentRegisters[2],  // E
-          individualArgumentRegisters[3],  // F
-          individualArgumentRegisters[4]); // G
+      instruction =
+          new DexInvokeSuper(
+              argumentRegistersCount,
+              getInvokedMethod(),
+              individualArgumentRegisters[0], // C
+              individualArgumentRegisters[1], // D
+              individualArgumentRegisters[2], // E
+              individualArgumentRegisters[3], // F
+              individualArgumentRegisters[4]); // G
     }
     addInvokeAndMoveResult(instruction, builder);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
index d0bca6a..fed5f58 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
@@ -6,7 +6,9 @@
 import static com.android.tools.r8.graph.DexEncodedMethod.asDexClassAndMethodOrNull;
 
 import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.code.InvokeVirtualRange;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
+import com.android.tools.r8.dex.code.DexInvokeVirtualRange;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMethod;
@@ -62,24 +64,25 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int argumentRegisters = requiredArgumentRegisters();
     builder.requestOutgoingRegisters(argumentRegisters);
     if (needsRangedInvoke(builder)) {
       assert argumentsConsecutive(builder);
       int firstRegister = argumentRegisterValue(0, builder);
-      instruction = new InvokeVirtualRange(firstRegister, argumentRegisters, getInvokedMethod());
+      instruction = new DexInvokeVirtualRange(firstRegister, argumentRegisters, getInvokedMethod());
     } else {
       int[] individualArgumentRegisters = new int[5];
       int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters);
-      instruction = new com.android.tools.r8.code.InvokeVirtual(
-          argumentRegistersCount,
-          getInvokedMethod(),
-          individualArgumentRegisters[0],  // C
-          individualArgumentRegisters[1],  // D
-          individualArgumentRegisters[2],  // E
-          individualArgumentRegisters[3],  // F
-          individualArgumentRegisters[4]); // G
+      instruction =
+          new DexInvokeVirtual(
+              argumentRegistersCount,
+              getInvokedMethod(),
+              individualArgumentRegisters[0], // C
+              individualArgumentRegisters[1], // D
+              individualArgumentRegisters[2], // E
+              individualArgumentRegisters[3], // F
+              individualArgumentRegisters[4]); // G
     }
     addInvokeAndMoveResult(instruction, builder);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java b/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java
index b647ecf..c9a1b03 100644
--- a/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java
+++ b/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfLogicalBinop;
-import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.ir.analysis.constant.Bottom;
 import com.android.tools.r8.ir.analysis.constant.ConstLatticeElement;
@@ -20,17 +20,17 @@
     super(type, dest, left, right);
   }
 
-  public abstract com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right);
+  public abstract DexInstruction CreateInt(int dest, int left, int right);
 
-  public abstract Instruction CreateLong(int dest, int left, int right);
+  public abstract DexInstruction CreateLong(int dest, int left, int right);
 
-  public abstract Instruction CreateInt2Addr(int left, int right);
+  public abstract DexInstruction CreateInt2Addr(int left, int right);
 
-  public abstract Instruction CreateLong2Addr(int left, int right);
+  public abstract DexInstruction CreateLong2Addr(int left, int right);
 
-  public abstract Instruction CreateIntLit8(int dest, int left, int constant);
+  public abstract DexInstruction CreateIntLit8(int dest, int left, int constant);
 
-  public abstract Instruction CreateIntLit16(int dest, int left, int constant);
+  public abstract DexInstruction CreateIntLit16(int dest, int left, int constant);
 
   @Override
   public boolean canBeFolded() {
@@ -54,7 +54,7 @@
     // that will change.
     int left = builder.allocatedRegister(leftValue(), getNumber());
     int dest = builder.allocatedRegister(outValue, getNumber());
-    Instruction instruction;
+    DexInstruction instruction;
     if (isTwoAddr(builder.getRegisterAllocator())) {
       int right = builder.allocatedRegister(rightValue(), getNumber());
       if (left != dest) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/Monitor.java b/src/main/java/com/android/tools/r8/ir/code/Monitor.java
index 648c9fd..1e00e9b 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Monitor.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Monitor.java
@@ -8,8 +8,8 @@
 
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.code.CfMonitor;
-import com.android.tools.r8.code.MonitorEnter;
-import com.android.tools.r8.code.MonitorExit;
+import com.android.tools.r8.dex.code.DexMonitorEnter;
+import com.android.tools.r8.dex.code.DexMonitorExit;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.ProgramMethod;
@@ -65,9 +65,9 @@
       object = builder.allocatedRegister(object(), getNumber());
     }
     if (type == Type.ENTER) {
-      builder.add(this, new MonitorEnter(object));
+      builder.add(this, new DexMonitorEnter(object));
     } else {
-      builder.add(this, new MonitorExit(object));
+      builder.add(this, new DexMonitorExit(object));
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/MoveException.java b/src/main/java/com/android/tools/r8/ir/code/MoveException.java
index efec2dd..616882a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/MoveException.java
+++ b/src/main/java/com/android/tools/r8/ir/code/MoveException.java
@@ -6,6 +6,7 @@
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexMoveException;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.ProgramMethod;
@@ -45,7 +46,7 @@
   @Override
   public void buildDex(DexBuilder builder) {
     int dest = builder.allocatedRegister(dest(), getNumber());
-    builder.add(this, new com.android.tools.r8.code.MoveException(dest));
+    builder.add(this, new DexMoveException(dest));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Mul.java b/src/main/java/com/android/tools/r8/ir/code/Mul.java
index dcc8e1b..ccddf6a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Mul.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Mul.java
@@ -5,16 +5,17 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfArithmeticBinop;
-import com.android.tools.r8.code.MulDouble;
-import com.android.tools.r8.code.MulDouble2Addr;
-import com.android.tools.r8.code.MulFloat;
-import com.android.tools.r8.code.MulFloat2Addr;
-import com.android.tools.r8.code.MulInt;
-import com.android.tools.r8.code.MulInt2Addr;
-import com.android.tools.r8.code.MulIntLit16;
-import com.android.tools.r8.code.MulIntLit8;
-import com.android.tools.r8.code.MulLong;
-import com.android.tools.r8.code.MulLong2Addr;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexMulDouble;
+import com.android.tools.r8.dex.code.DexMulDouble2Addr;
+import com.android.tools.r8.dex.code.DexMulFloat;
+import com.android.tools.r8.dex.code.DexMulFloat2Addr;
+import com.android.tools.r8.dex.code.DexMulInt;
+import com.android.tools.r8.dex.code.DexMulInt2Addr;
+import com.android.tools.r8.dex.code.DexMulIntLit16;
+import com.android.tools.r8.dex.code.DexMulIntLit8;
+import com.android.tools.r8.dex.code.DexMulLong;
+import com.android.tools.r8.dex.code.DexMulLong2Addr;
 
 public class Mul extends ArithmeticBinop {
 
@@ -38,65 +39,67 @@
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) {
+  public DexInstruction CreateInt(int dest, int left, int right) {
     // Flip arguments if dest and right are the same to work around x86 code generation bug on
     // Android L. See https://android-review.googlesource.com/#/c/114932/ for the fix for Android
     // M.
-    return dest == right ? new MulInt(dest, right, left) : new MulInt(dest, left, right);
+    return dest == right ? new DexMulInt(dest, right, left) : new DexMulInt(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) {
+  public DexInstruction CreateLong(int dest, int left, int right) {
     // Flip arguments if dest and right are the same to work around x86 code generation bug on
     // Android L. See https://android-review.googlesource.com/#/c/114932/ for the fix for Android
     // M.
-    return dest == right ? new MulLong(dest, right, left) : new MulLong(dest, left, right);
+    return dest == right ? new DexMulLong(dest, right, left) : new DexMulLong(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateFloat(int dest, int left, int right) {
+  public DexInstruction CreateFloat(int dest, int left, int right) {
     // Flip arguments if dest and right are the same to work around x86 code generation bug on
     // Android L. See https://android-review.googlesource.com/#/c/114932/ for the fix for Android
     // M.
-    return dest == right ? new MulFloat(dest, right, left) : new MulFloat(dest, left, right);
+    return dest == right ? new DexMulFloat(dest, right, left) : new DexMulFloat(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateDouble(int dest, int left, int right) {
+  public DexInstruction CreateDouble(int dest, int left, int right) {
     // Flip arguments if dest and right are the same to work around x86 code generation bug on
     // Android L. See https://android-review.googlesource.com/#/c/114932/ for the fix for Android
     // M.
-    return dest == right ? new MulDouble(dest, right, left) : new MulDouble(dest, left, right);
+    return dest == right
+        ? new DexMulDouble(dest, right, left)
+        : new DexMulDouble(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) {
-    return new MulInt2Addr(left, right);
+  public DexInstruction CreateInt2Addr(int left, int right) {
+    return new DexMulInt2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) {
-    return new MulLong2Addr(left, right);
+  public DexInstruction CreateLong2Addr(int left, int right) {
+    return new DexMulLong2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateFloat2Addr(int left, int right) {
-    return new MulFloat2Addr(left, right);
+  public DexInstruction CreateFloat2Addr(int left, int right) {
+    return new DexMulFloat2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateDouble2Addr(int left, int right) {
-    return new MulDouble2Addr(left, right);
+  public DexInstruction CreateDouble2Addr(int left, int right) {
+    return new DexMulDouble2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) {
-    return new MulIntLit8(dest, left, constant);
+  public DexInstruction CreateIntLit8(int dest, int left, int constant) {
+    return new DexMulIntLit8(dest, left, constant);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) {
-    return new MulIntLit16(dest, left, constant);
+  public DexInstruction CreateIntLit16(int dest, int left, int constant) {
+    return new DexMulIntLit16(dest, left, constant);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Neg.java b/src/main/java/com/android/tools/r8/ir/code/Neg.java
index 459c8c5..dde52df 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Neg.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Neg.java
@@ -4,10 +4,11 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfNeg;
-import com.android.tools.r8.code.NegDouble;
-import com.android.tools.r8.code.NegFloat;
-import com.android.tools.r8.code.NegInt;
-import com.android.tools.r8.code.NegLong;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexNegDouble;
+import com.android.tools.r8.dex.code.DexNegFloat;
+import com.android.tools.r8.dex.code.DexNegInt;
+import com.android.tools.r8.dex.code.DexNegLong;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.ir.analysis.constant.Bottom;
 import com.android.tools.r8.ir.analysis.constant.ConstLatticeElement;
@@ -51,21 +52,21 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int dest = builder.allocatedRegister(dest(), getNumber());
     int src = builder.allocatedRegister(source(), getNumber());
     switch (type) {
       case INT:
-        instruction = new NegInt(dest, src);
+        instruction = new DexNegInt(dest, src);
         break;
       case LONG:
-        instruction = new NegLong(dest, src);
+        instruction = new DexNegLong(dest, src);
         break;
       case FLOAT:
-        instruction = new NegFloat(dest, src);
+        instruction = new DexNegFloat(dest, src);
         break;
       case DOUBLE:
-        instruction = new NegDouble(dest, src);
+        instruction = new DexNegDouble(dest, src);
         break;
       default:
         throw new Unreachable("Unexpected type " + type);
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java b/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
index 500766c..88bd18d 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
@@ -6,8 +6,8 @@
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfNewArray;
-import com.android.tools.r8.code.NewArray;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexNewArray;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexType;
@@ -59,7 +59,7 @@
   public void buildDex(DexBuilder builder) {
     int size = builder.allocatedRegister(size(), getNumber());
     int dest = builder.allocatedRegister(dest(), getNumber());
-    builder.add(this, new NewArray(dest, size, type));
+    builder.add(this, new DexNewArray(dest, size, type));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java b/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java
index 260689f..15f7224 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java
@@ -4,9 +4,9 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.LoadStoreHelper;
-import com.android.tools.r8.code.FillArrayData;
-import com.android.tools.r8.code.FillArrayDataPayload;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexFillArrayData;
+import com.android.tools.r8.dex.code.DexFillArrayDataPayload;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
@@ -50,14 +50,14 @@
     return inValues.get(0);
   }
 
-  public FillArrayDataPayload createPayload() {
-    return new FillArrayDataPayload(element_width, size, data);
+  public DexFillArrayDataPayload createPayload() {
+    return new DexFillArrayDataPayload(element_width, size, data);
   }
 
   @Override
   public void buildDex(DexBuilder builder) {
     int src = builder.allocatedRegister(src(), getNumber());
-    builder.addFillArrayData(this, new FillArrayData(src));
+    builder.addFillArrayData(this, new DexFillArrayData(src));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
index 85bae5c..d6c938d 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfNew;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexNewInstance;
 import com.android.tools.r8.graph.AccessControl;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
@@ -68,7 +69,7 @@
   @Override
   public void buildDex(DexBuilder builder) {
     int dest = builder.allocatedRegister(dest(), getNumber());
-    builder.add(this, new com.android.tools.r8.code.NewInstance(dest, clazz));
+    builder.add(this, new DexNewInstance(dest, clazz));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java
index b56600f..2274754 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java
@@ -6,8 +6,8 @@
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfNewUnboxedEnum;
-import com.android.tools.r8.code.DexNewUnboxedEnumInstance;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexNewUnboxedEnumInstance;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.ProgramMethod;
diff --git a/src/main/java/com/android/tools/r8/ir/code/Not.java b/src/main/java/com/android/tools/r8/ir/code/Not.java
index d000623..097ae22 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Not.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Not.java
@@ -4,8 +4,9 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.LoadStoreHelper;
-import com.android.tools.r8.code.NotInt;
-import com.android.tools.r8.code.NotLong;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexNotInt;
+import com.android.tools.r8.dex.code.DexNotLong;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.ir.analysis.constant.Bottom;
 import com.android.tools.r8.ir.analysis.constant.ConstLatticeElement;
@@ -62,15 +63,15 @@
   @Override
   public void buildDex(DexBuilder builder) {
     assert builder.getOptions().canUseNotInstruction();
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int dest = builder.allocatedRegister(dest(), getNumber());
     int src = builder.allocatedRegister(source(), getNumber());
     switch (type) {
       case INT:
-        instruction = new NotInt(dest, src);
+        instruction = new DexNotInt(dest, src);
         break;
       case LONG:
-        instruction = new NotLong(dest, src);
+        instruction = new DexNotLong(dest, src);
         break;
       default:
         throw new Unreachable("Unexpected type " + type);
diff --git a/src/main/java/com/android/tools/r8/ir/code/NumberConversion.java b/src/main/java/com/android/tools/r8/ir/code/NumberConversion.java
index 5f3b592..55ed123 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NumberConversion.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NumberConversion.java
@@ -4,21 +4,22 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfNumberConversion;
-import com.android.tools.r8.code.DoubleToFloat;
-import com.android.tools.r8.code.DoubleToInt;
-import com.android.tools.r8.code.DoubleToLong;
-import com.android.tools.r8.code.FloatToDouble;
-import com.android.tools.r8.code.FloatToInt;
-import com.android.tools.r8.code.FloatToLong;
-import com.android.tools.r8.code.IntToByte;
-import com.android.tools.r8.code.IntToChar;
-import com.android.tools.r8.code.IntToDouble;
-import com.android.tools.r8.code.IntToFloat;
-import com.android.tools.r8.code.IntToLong;
-import com.android.tools.r8.code.IntToShort;
-import com.android.tools.r8.code.LongToDouble;
-import com.android.tools.r8.code.LongToFloat;
-import com.android.tools.r8.code.LongToInt;
+import com.android.tools.r8.dex.code.DexDoubleToFloat;
+import com.android.tools.r8.dex.code.DexDoubleToInt;
+import com.android.tools.r8.dex.code.DexDoubleToLong;
+import com.android.tools.r8.dex.code.DexFloatToDouble;
+import com.android.tools.r8.dex.code.DexFloatToInt;
+import com.android.tools.r8.dex.code.DexFloatToLong;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexIntToByte;
+import com.android.tools.r8.dex.code.DexIntToChar;
+import com.android.tools.r8.dex.code.DexIntToDouble;
+import com.android.tools.r8.dex.code.DexIntToFloat;
+import com.android.tools.r8.dex.code.DexIntToLong;
+import com.android.tools.r8.dex.code.DexIntToShort;
+import com.android.tools.r8.dex.code.DexLongToDouble;
+import com.android.tools.r8.dex.code.DexLongToFloat;
+import com.android.tools.r8.dex.code.DexLongToInt;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.ir.analysis.type.PrimitiveTypeElement;
@@ -54,29 +55,29 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int dest = builder.allocatedRegister(dest(), getNumber());
     int src = builder.allocatedRegister(source(), getNumber());
     switch (from) {
       case INT:
         switch (to) {
           case BYTE:
-            instruction = new IntToByte(dest, src);
+            instruction = new DexIntToByte(dest, src);
             break;
           case CHAR:
-            instruction = new IntToChar(dest, src);
+            instruction = new DexIntToChar(dest, src);
             break;
           case SHORT:
-            instruction = new IntToShort(dest, src);
+            instruction = new DexIntToShort(dest, src);
             break;
           case LONG:
-            instruction = new IntToLong(dest, src);
+            instruction = new DexIntToLong(dest, src);
             break;
           case FLOAT:
-            instruction = new IntToFloat(dest, src);
+            instruction = new DexIntToFloat(dest, src);
             break;
           case DOUBLE:
-            instruction = new IntToDouble(dest, src);
+            instruction = new DexIntToDouble(dest, src);
             break;
           default:
             throw new Unreachable("Unexpected types " + from + ", " + to);
@@ -85,13 +86,13 @@
       case LONG:
         switch (to) {
           case INT:
-            instruction = new LongToInt(dest, src);
+            instruction = new DexLongToInt(dest, src);
             break;
           case FLOAT:
-            instruction = new LongToFloat(dest, src);
+            instruction = new DexLongToFloat(dest, src);
             break;
           case DOUBLE:
-            instruction = new LongToDouble(dest, src);
+            instruction = new DexLongToDouble(dest, src);
             break;
           default:
             throw new Unreachable("Unexpected types " + from + ", " + to);
@@ -100,13 +101,13 @@
       case FLOAT:
         switch (to) {
           case INT:
-            instruction = new FloatToInt(dest, src);
+            instruction = new DexFloatToInt(dest, src);
             break;
           case LONG:
-            instruction = new FloatToLong(dest, src);
+            instruction = new DexFloatToLong(dest, src);
             break;
           case DOUBLE:
-            instruction = new FloatToDouble(dest, src);
+            instruction = new DexFloatToDouble(dest, src);
             break;
           default:
             throw new Unreachable("Unexpected types " + from + ", " + to);
@@ -115,13 +116,13 @@
       case DOUBLE:
         switch (to) {
           case INT:
-            instruction = new DoubleToInt(dest, src);
+            instruction = new DexDoubleToInt(dest, src);
             break;
           case LONG:
-            instruction = new DoubleToLong(dest, src);
+            instruction = new DexDoubleToLong(dest, src);
             break;
           case FLOAT:
-            instruction = new DoubleToFloat(dest, src);
+            instruction = new DexDoubleToFloat(dest, src);
             break;
           default:
             throw new Unreachable("Unexpected types " + from + ", " + to);
diff --git a/src/main/java/com/android/tools/r8/ir/code/Or.java b/src/main/java/com/android/tools/r8/ir/code/Or.java
index a17cb7f..3fd1a77 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Or.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Or.java
@@ -4,12 +4,13 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfLogicalBinop;
-import com.android.tools.r8.code.OrInt;
-import com.android.tools.r8.code.OrInt2Addr;
-import com.android.tools.r8.code.OrIntLit16;
-import com.android.tools.r8.code.OrIntLit8;
-import com.android.tools.r8.code.OrLong;
-import com.android.tools.r8.code.OrLong2Addr;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexOrInt;
+import com.android.tools.r8.dex.code.DexOrInt2Addr;
+import com.android.tools.r8.dex.code.DexOrIntLit16;
+import com.android.tools.r8.dex.code.DexOrIntLit8;
+import com.android.tools.r8.dex.code.DexOrLong;
+import com.android.tools.r8.dex.code.DexOrLong2Addr;
 import java.util.Set;
 
 public class Or extends LogicalBinop {
@@ -44,33 +45,33 @@
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) {
-    return new OrInt(dest, left, right);
+  public DexInstruction CreateInt(int dest, int left, int right) {
+    return new DexOrInt(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) {
-    return new OrLong(dest, left, right);
+  public DexInstruction CreateLong(int dest, int left, int right) {
+    return new DexOrLong(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) {
-    return new OrInt2Addr(left, right);
+  public DexInstruction CreateInt2Addr(int left, int right) {
+    return new DexOrInt2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) {
-    return new OrLong2Addr(left, right);
+  public DexInstruction CreateLong2Addr(int left, int right) {
+    return new DexOrLong2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) {
-    return new OrIntLit8(dest, left, constant);
+  public DexInstruction CreateIntLit8(int dest, int left, int constant) {
+    return new DexOrIntLit8(dest, left, constant);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) {
-    return new OrIntLit16(dest, left, constant);
+  public DexInstruction CreateIntLit16(int dest, int left, int constant) {
+    return new DexOrIntLit16(dest, left, constant);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/RecordFieldValues.java b/src/main/java/com/android/tools/r8/ir/code/RecordFieldValues.java
index a2949d0..db1cfaf 100644
--- a/src/main/java/com/android/tools/r8/ir/code/RecordFieldValues.java
+++ b/src/main/java/com/android/tools/r8/ir/code/RecordFieldValues.java
@@ -6,8 +6,8 @@
 
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.code.CfRecordFieldValues;
-import com.android.tools.r8.code.DexRecordFieldValues;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexRecordFieldValues;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.ProgramMethod;
diff --git a/src/main/java/com/android/tools/r8/ir/code/Rem.java b/src/main/java/com/android/tools/r8/ir/code/Rem.java
index f6f40fa..df5ffc1 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Rem.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Rem.java
@@ -4,16 +4,17 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfArithmeticBinop;
-import com.android.tools.r8.code.RemDouble;
-import com.android.tools.r8.code.RemDouble2Addr;
-import com.android.tools.r8.code.RemFloat;
-import com.android.tools.r8.code.RemFloat2Addr;
-import com.android.tools.r8.code.RemInt;
-import com.android.tools.r8.code.RemInt2Addr;
-import com.android.tools.r8.code.RemIntLit16;
-import com.android.tools.r8.code.RemIntLit8;
-import com.android.tools.r8.code.RemLong;
-import com.android.tools.r8.code.RemLong2Addr;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexRemDouble;
+import com.android.tools.r8.dex.code.DexRemDouble2Addr;
+import com.android.tools.r8.dex.code.DexRemFloat;
+import com.android.tools.r8.dex.code.DexRemFloat2Addr;
+import com.android.tools.r8.dex.code.DexRemInt;
+import com.android.tools.r8.dex.code.DexRemInt2Addr;
+import com.android.tools.r8.dex.code.DexRemIntLit16;
+import com.android.tools.r8.dex.code.DexRemIntLit8;
+import com.android.tools.r8.dex.code.DexRemLong;
+import com.android.tools.r8.dex.code.DexRemLong2Addr;
 import com.android.tools.r8.ir.analysis.constant.Bottom;
 import com.android.tools.r8.ir.analysis.constant.LatticeElement;
 import java.util.function.Function;
@@ -50,53 +51,53 @@
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) {
-    return new RemInt(dest, left, right);
+  public DexInstruction CreateInt(int dest, int left, int right) {
+    return new DexRemInt(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) {
-    return new RemLong(dest, left, right);
+  public DexInstruction CreateLong(int dest, int left, int right) {
+    return new DexRemLong(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateFloat(int dest, int left, int right) {
-    return new RemFloat(dest, left, right);
+  public DexInstruction CreateFloat(int dest, int left, int right) {
+    return new DexRemFloat(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateDouble(int dest, int left, int right) {
-    return new RemDouble(dest, left, right);
+  public DexInstruction CreateDouble(int dest, int left, int right) {
+    return new DexRemDouble(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) {
-    return new RemInt2Addr(left, right);
+  public DexInstruction CreateInt2Addr(int left, int right) {
+    return new DexRemInt2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) {
-    return new RemLong2Addr(left, right);
+  public DexInstruction CreateLong2Addr(int left, int right) {
+    return new DexRemLong2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateFloat2Addr(int left, int right) {
-    return new RemFloat2Addr(left, right);
+  public DexInstruction CreateFloat2Addr(int left, int right) {
+    return new DexRemFloat2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateDouble2Addr(int left, int right) {
-    return new RemDouble2Addr(left, right);
+  public DexInstruction CreateDouble2Addr(int left, int right) {
+    return new DexRemDouble2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) {
-    return new RemIntLit8(dest, left, constant);
+  public DexInstruction CreateIntLit8(int dest, int left, int constant) {
+    return new DexRemIntLit8(dest, left, constant);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) {
-    return new RemIntLit16(dest, left, constant);
+  public DexInstruction CreateIntLit16(int dest, int left, int constant) {
+    return new DexRemIntLit16(dest, left, constant);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Return.java b/src/main/java/com/android/tools/r8/ir/code/Return.java
index 1ec1a8e..752b30c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Return.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Return.java
@@ -6,10 +6,12 @@
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.code.CfReturn;
 import com.android.tools.r8.cf.code.CfReturnVoid;
-import com.android.tools.r8.code.ReturnObject;
-import com.android.tools.r8.code.ReturnVoid;
-import com.android.tools.r8.code.ReturnWide;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexReturn;
+import com.android.tools.r8.dex.code.DexReturnObject;
+import com.android.tools.r8.dex.code.DexReturnVoid;
+import com.android.tools.r8.dex.code.DexReturnWide;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.analysis.type.TypeElement;
@@ -60,20 +62,20 @@
     return inValues.get(0);
   }
 
-  public com.android.tools.r8.code.Instruction createDexInstruction(DexBuilder builder) {
+  public DexInstruction createDexInstruction(DexBuilder builder) {
     if (isReturnVoid()) {
-      return new ReturnVoid();
+      return new DexReturnVoid();
     }
     int register = builder.allocatedRegister(returnValue(), getNumber());
     TypeElement returnType = getReturnType();
     if (returnType.isReferenceType()) {
-      return new ReturnObject(register);
+      return new DexReturnObject(register);
     }
     if (returnType.isSinglePrimitive()) {
-      return new com.android.tools.r8.code.Return(register);
+      return new DexReturn(register);
     }
     if (returnType.isWidePrimitive()) {
-      return new ReturnWide(register);
+      return new DexReturnWide(register);
     }
     throw new Unreachable();
   }
diff --git a/src/main/java/com/android/tools/r8/ir/code/SafeCheckCast.java b/src/main/java/com/android/tools/r8/ir/code/SafeCheckCast.java
index b811f86..1aee996 100644
--- a/src/main/java/com/android/tools/r8/ir/code/SafeCheckCast.java
+++ b/src/main/java/com/android/tools/r8/ir/code/SafeCheckCast.java
@@ -5,6 +5,8 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfSafeCheckCast;
+import com.android.tools.r8.dex.code.DexCheckCast;
+import com.android.tools.r8.dex.code.DexSafeCheckCast;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.ProgramMethod;
@@ -26,8 +28,8 @@
   }
 
   @Override
-  com.android.tools.r8.code.CheckCast createCheckCast(int register) {
-    return new com.android.tools.r8.code.SafeCheckCast(register, getType());
+  DexCheckCast createCheckCast(int register) {
+    return new DexSafeCheckCast(register, getType());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Shl.java b/src/main/java/com/android/tools/r8/ir/code/Shl.java
index b297552..d18262a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Shl.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Shl.java
@@ -4,11 +4,12 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfLogicalBinop;
-import com.android.tools.r8.code.ShlInt;
-import com.android.tools.r8.code.ShlInt2Addr;
-import com.android.tools.r8.code.ShlIntLit8;
-import com.android.tools.r8.code.ShlLong;
-import com.android.tools.r8.code.ShlLong2Addr;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexShlInt;
+import com.android.tools.r8.dex.code.DexShlInt2Addr;
+import com.android.tools.r8.dex.code.DexShlIntLit8;
+import com.android.tools.r8.dex.code.DexShlLong;
+import com.android.tools.r8.dex.code.DexShlLong2Addr;
 import com.android.tools.r8.errors.Unreachable;
 
 public class Shl extends LogicalBinop {
@@ -49,32 +50,32 @@
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) {
-    return new ShlInt(dest, left, right);
+  public DexInstruction CreateInt(int dest, int left, int right) {
+    return new DexShlInt(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) {
-    return new ShlLong(dest, left, right);
+  public DexInstruction CreateLong(int dest, int left, int right) {
+    return new DexShlLong(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) {
-    return new ShlInt2Addr(left, right);
+  public DexInstruction CreateInt2Addr(int left, int right) {
+    return new DexShlInt2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) {
-    return new ShlLong2Addr(left, right);
+  public DexInstruction CreateLong2Addr(int left, int right) {
+    return new DexShlLong2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) {
-    return new ShlIntLit8(dest, left, constant);
+  public DexInstruction CreateIntLit8(int dest, int left, int constant) {
+    return new DexShlIntLit8(dest, left, constant);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) {
+  public DexInstruction CreateIntLit16(int dest, int left, int constant) {
     throw new Unreachable("Unsupported instruction ShlIntLit16");
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/Shr.java b/src/main/java/com/android/tools/r8/ir/code/Shr.java
index 36ff98b..5a93057 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Shr.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Shr.java
@@ -4,11 +4,12 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfLogicalBinop;
-import com.android.tools.r8.code.ShrInt;
-import com.android.tools.r8.code.ShrInt2Addr;
-import com.android.tools.r8.code.ShrIntLit8;
-import com.android.tools.r8.code.ShrLong;
-import com.android.tools.r8.code.ShrLong2Addr;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexShrInt;
+import com.android.tools.r8.dex.code.DexShrInt2Addr;
+import com.android.tools.r8.dex.code.DexShrIntLit8;
+import com.android.tools.r8.dex.code.DexShrLong;
+import com.android.tools.r8.dex.code.DexShrLong2Addr;
 import com.android.tools.r8.errors.Unreachable;
 
 public class Shr extends LogicalBinop {
@@ -49,32 +50,32 @@
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) {
-    return new ShrInt(dest, left, right);
+  public DexInstruction CreateInt(int dest, int left, int right) {
+    return new DexShrInt(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) {
-    return new ShrLong(dest, left, right);
+  public DexInstruction CreateLong(int dest, int left, int right) {
+    return new DexShrLong(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) {
-    return new ShrInt2Addr(left, right);
+  public DexInstruction CreateInt2Addr(int left, int right) {
+    return new DexShrInt2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) {
-    return new ShrLong2Addr(left, right);
+  public DexInstruction CreateLong2Addr(int left, int right) {
+    return new DexShrLong2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) {
-    return new ShrIntLit8(dest, left, constant);
+  public DexInstruction CreateIntLit8(int dest, int left, int constant) {
+    return new DexShrIntLit8(dest, left, constant);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) {
+  public DexInstruction CreateIntLit16(int dest, int left, int constant) {
     throw new Unreachable("Unsupported instruction ShrIntLit16");
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
index c4413d0..a078dde 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
@@ -6,14 +6,15 @@
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfStaticFieldRead;
-import com.android.tools.r8.code.Sget;
-import com.android.tools.r8.code.SgetBoolean;
-import com.android.tools.r8.code.SgetByte;
-import com.android.tools.r8.code.SgetChar;
-import com.android.tools.r8.code.SgetObject;
-import com.android.tools.r8.code.SgetShort;
-import com.android.tools.r8.code.SgetWide;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexSget;
+import com.android.tools.r8.dex.code.DexSgetBoolean;
+import com.android.tools.r8.dex.code.DexSgetByte;
+import com.android.tools.r8.dex.code.DexSgetChar;
+import com.android.tools.r8.dex.code.DexSgetObject;
+import com.android.tools.r8.dex.code.DexSgetShort;
+import com.android.tools.r8.dex.code.DexSgetWide;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClassAndField;
@@ -97,32 +98,32 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int dest = builder.allocatedRegister(dest(), getNumber());
     DexField field = getField();
     switch (getType()) {
       case INT:
       case FLOAT:
-        instruction = new Sget(dest, field);
+        instruction = new DexSget(dest, field);
         break;
       case LONG:
       case DOUBLE:
-        instruction = new SgetWide(dest, field);
+        instruction = new DexSgetWide(dest, field);
         break;
       case OBJECT:
-        instruction = new SgetObject(dest, field);
+        instruction = new DexSgetObject(dest, field);
         break;
       case BOOLEAN:
-        instruction = new SgetBoolean(dest, field);
+        instruction = new DexSgetBoolean(dest, field);
         break;
       case BYTE:
-        instruction = new SgetByte(dest, field);
+        instruction = new DexSgetByte(dest, field);
         break;
       case CHAR:
-        instruction = new SgetChar(dest, field);
+        instruction = new DexSgetChar(dest, field);
         break;
       case SHORT:
-        instruction = new SgetShort(dest, field);
+        instruction = new DexSgetShort(dest, field);
         break;
       default:
         throw new Unreachable("Unexpected type: " + getType());
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
index b28f281..7d54dbb 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
@@ -5,14 +5,15 @@
 
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.code.CfStaticFieldWrite;
-import com.android.tools.r8.code.Sput;
-import com.android.tools.r8.code.SputBoolean;
-import com.android.tools.r8.code.SputByte;
-import com.android.tools.r8.code.SputChar;
-import com.android.tools.r8.code.SputObject;
-import com.android.tools.r8.code.SputShort;
-import com.android.tools.r8.code.SputWide;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexSput;
+import com.android.tools.r8.dex.code.DexSputBoolean;
+import com.android.tools.r8.dex.code.DexSputByte;
+import com.android.tools.r8.dex.code.DexSputChar;
+import com.android.tools.r8.dex.code.DexSputObject;
+import com.android.tools.r8.dex.code.DexSputShort;
+import com.android.tools.r8.dex.code.DexSputWide;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexEncodedField;
@@ -65,32 +66,32 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    com.android.tools.r8.code.Instruction instruction;
+    DexInstruction instruction;
     int src = builder.allocatedRegister(value(), getNumber());
     DexField field = getField();
     switch (getType()) {
       case INT:
       case FLOAT:
-        instruction = new Sput(src, field);
+        instruction = new DexSput(src, field);
         break;
       case LONG:
       case DOUBLE:
-        instruction = new SputWide(src, field);
+        instruction = new DexSputWide(src, field);
         break;
       case OBJECT:
-        instruction = new SputObject(src, field);
+        instruction = new DexSputObject(src, field);
         break;
       case BOOLEAN:
-        instruction = new SputBoolean(src, field);
+        instruction = new DexSputBoolean(src, field);
         break;
       case BYTE:
-        instruction = new SputByte(src, field);
+        instruction = new DexSputByte(src, field);
         break;
       case CHAR:
-        instruction = new SputChar(src, field);
+        instruction = new DexSputChar(src, field);
         break;
       case SHORT:
-        instruction = new SputShort(src, field);
+        instruction = new DexSputShort(src, field);
         break;
       default:
         throw new Unreachable("Unexpected type: " + getType());
diff --git a/src/main/java/com/android/tools/r8/ir/code/Sub.java b/src/main/java/com/android/tools/r8/ir/code/Sub.java
index e161b8e..fab70d7 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Sub.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Sub.java
@@ -5,19 +5,20 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfArithmeticBinop;
-import com.android.tools.r8.code.AddIntLit16;
-import com.android.tools.r8.code.AddIntLit8;
-import com.android.tools.r8.code.RsubInt;
-import com.android.tools.r8.code.RsubIntLit8;
-import com.android.tools.r8.code.SubDouble;
-import com.android.tools.r8.code.SubDouble2Addr;
-import com.android.tools.r8.code.SubFloat;
-import com.android.tools.r8.code.SubFloat2Addr;
-import com.android.tools.r8.code.SubInt;
-import com.android.tools.r8.code.SubInt2Addr;
-import com.android.tools.r8.code.SubLong;
-import com.android.tools.r8.code.SubLong2Addr;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexAddIntLit16;
+import com.android.tools.r8.dex.code.DexAddIntLit8;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexRsubInt;
+import com.android.tools.r8.dex.code.DexRsubIntLit8;
+import com.android.tools.r8.dex.code.DexSubDouble;
+import com.android.tools.r8.dex.code.DexSubDouble2Addr;
+import com.android.tools.r8.dex.code.DexSubFloat;
+import com.android.tools.r8.dex.code.DexSubFloat2Addr;
+import com.android.tools.r8.dex.code.DexSubInt;
+import com.android.tools.r8.dex.code.DexSubInt2Addr;
+import com.android.tools.r8.dex.code.DexSubLong;
+import com.android.tools.r8.dex.code.DexSubLong2Addr;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.ir.conversion.DexBuilder;
 
@@ -43,53 +44,53 @@
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) {
-    return new SubInt(dest, left, right);
+  public DexInstruction CreateInt(int dest, int left, int right) {
+    return new DexSubInt(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) {
-    return new SubLong(dest, left, right);
+  public DexInstruction CreateLong(int dest, int left, int right) {
+    return new DexSubLong(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateFloat(int dest, int left, int right) {
-    return new SubFloat(dest, left, right);
+  public DexInstruction CreateFloat(int dest, int left, int right) {
+    return new DexSubFloat(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateDouble(int dest, int left, int right) {
-    return new SubDouble(dest, left, right);
+  public DexInstruction CreateDouble(int dest, int left, int right) {
+    return new DexSubDouble(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) {
-    return new SubInt2Addr(left, right);
+  public DexInstruction CreateInt2Addr(int left, int right) {
+    return new DexSubInt2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) {
-    return new SubLong2Addr(left, right);
+  public DexInstruction CreateLong2Addr(int left, int right) {
+    return new DexSubLong2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateFloat2Addr(int left, int right) {
-    return new SubFloat2Addr(left, right);
+  public DexInstruction CreateFloat2Addr(int left, int right) {
+    return new DexSubFloat2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateDouble2Addr(int left, int right) {
-    return new SubDouble2Addr(left, right);
+  public DexInstruction CreateDouble2Addr(int left, int right) {
+    return new DexSubDouble2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) {
+  public DexInstruction CreateIntLit8(int dest, int left, int constant) {
     // The sub instructions with constants are rsub, and is handled below.
     throw new Unreachable("Unsupported instruction SubIntLit8");
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) {
+  public DexInstruction CreateIntLit16(int dest, int left, int constant) {
     // The sub instructions with constants are rsub, and is handled below.
     throw new Unreachable("Unsupported instruction SubIntLit16");
   }
@@ -166,7 +167,7 @@
       return;
     }
 
-    com.android.tools.r8.code.Instruction instruction = null;
+    DexInstruction instruction = null;
     if (!needsValueInRegister(leftValue())) {
       // Sub instructions with small left constant is emitted as rsub.
       assert fitsInDexInstruction(leftValue());
@@ -174,10 +175,10 @@
       int right = builder.allocatedRegister(rightValue(), getNumber());
       int dest = builder.allocatedRegister(outValue, getNumber());
       if (left.is8Bit()) {
-        instruction = new RsubIntLit8(dest, right, left.getIntValue());
+        instruction = new DexRsubIntLit8(dest, right, left.getIntValue());
       } else {
         assert left.is16Bit();
-        instruction = new RsubInt(dest, right, left.getIntValue());
+        instruction = new DexRsubInt(dest, right, left.getIntValue());
       }
     } else if (!needsValueInRegister(rightValue())) {
       // Sub instructions with small right constant are emitted as add of the negative constant.
@@ -187,10 +188,10 @@
       int left = builder.allocatedRegister(leftValue(), getNumber());
       ConstNumber right = rightValue().getConstInstruction().asConstNumber();
       if (right.negativeIs8Bit()) {
-        instruction = new AddIntLit8(dest, left, -right.getIntValue());
+        instruction = new DexAddIntLit8(dest, left, -right.getIntValue());
       } else {
         assert right.negativeIs16Bit();
-        instruction = new AddIntLit16(dest, left, -right.getIntValue());
+        instruction = new DexAddIntLit16(dest, left, -right.getIntValue());
       }
     } else {
       assert type == NumericType.INT;
diff --git a/src/main/java/com/android/tools/r8/ir/code/Throw.java b/src/main/java/com/android/tools/r8/ir/code/Throw.java
index 6350255..7968409 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Throw.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Throw.java
@@ -6,6 +6,7 @@
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.code.CfThrow;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexThrow;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.analysis.type.TypeElement;
@@ -36,7 +37,7 @@
 
   @Override
   public void buildDex(DexBuilder builder) {
-    builder.add(this, new com.android.tools.r8.code.Throw(builder.allocatedRegister(exception(), getNumber())));
+    builder.add(this, new DexThrow(builder.allocatedRegister(exception(), getNumber())));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Ushr.java b/src/main/java/com/android/tools/r8/ir/code/Ushr.java
index 5de1830..4ea3be9 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Ushr.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Ushr.java
@@ -4,11 +4,12 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfLogicalBinop;
-import com.android.tools.r8.code.UshrInt;
-import com.android.tools.r8.code.UshrInt2Addr;
-import com.android.tools.r8.code.UshrIntLit8;
-import com.android.tools.r8.code.UshrLong;
-import com.android.tools.r8.code.UshrLong2Addr;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexUshrInt;
+import com.android.tools.r8.dex.code.DexUshrInt2Addr;
+import com.android.tools.r8.dex.code.DexUshrIntLit8;
+import com.android.tools.r8.dex.code.DexUshrLong;
+import com.android.tools.r8.dex.code.DexUshrLong2Addr;
 import com.android.tools.r8.errors.Unreachable;
 
 public class Ushr extends LogicalBinop {
@@ -49,32 +50,32 @@
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) {
-    return new UshrInt(dest, left, right);
+  public DexInstruction CreateInt(int dest, int left, int right) {
+    return new DexUshrInt(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) {
-    return new UshrLong(dest, left, right);
+  public DexInstruction CreateLong(int dest, int left, int right) {
+    return new DexUshrLong(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) {
-    return new UshrInt2Addr(left, right);
+  public DexInstruction CreateInt2Addr(int left, int right) {
+    return new DexUshrInt2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) {
-    return new UshrLong2Addr(left, right);
+  public DexInstruction CreateLong2Addr(int left, int right) {
+    return new DexUshrLong2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) {
-    return new UshrIntLit8(dest, left, constant);
+  public DexInstruction CreateIntLit8(int dest, int left, int constant) {
+    return new DexUshrIntLit8(dest, left, constant);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) {
+  public DexInstruction CreateIntLit16(int dest, int left, int constant) {
     throw new Unreachable("Unsupported instruction ShrIntLit16");
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/Xor.java b/src/main/java/com/android/tools/r8/ir/code/Xor.java
index dce5686..657374a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Xor.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Xor.java
@@ -4,12 +4,13 @@
 package com.android.tools.r8.ir.code;
 
 import com.android.tools.r8.cf.code.CfLogicalBinop;
-import com.android.tools.r8.code.XorInt;
-import com.android.tools.r8.code.XorInt2Addr;
-import com.android.tools.r8.code.XorIntLit16;
-import com.android.tools.r8.code.XorIntLit8;
-import com.android.tools.r8.code.XorLong;
-import com.android.tools.r8.code.XorLong2Addr;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexXorInt;
+import com.android.tools.r8.dex.code.DexXorInt2Addr;
+import com.android.tools.r8.dex.code.DexXorIntLit16;
+import com.android.tools.r8.dex.code.DexXorIntLit8;
+import com.android.tools.r8.dex.code.DexXorLong;
+import com.android.tools.r8.dex.code.DexXorLong2Addr;
 import java.util.Set;
 
 public class Xor extends LogicalBinop {
@@ -44,33 +45,33 @@
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) {
-    return new XorInt(dest, left, right);
+  public DexInstruction CreateInt(int dest, int left, int right) {
+    return new DexXorInt(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) {
-    return new XorLong(dest, left, right);
+  public DexInstruction CreateLong(int dest, int left, int right) {
+    return new DexXorLong(dest, left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) {
-    return new XorInt2Addr(left, right);
+  public DexInstruction CreateInt2Addr(int left, int right) {
+    return new DexXorInt2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) {
-    return new XorLong2Addr(left, right);
+  public DexInstruction CreateLong2Addr(int left, int right) {
+    return new DexXorLong2Addr(left, right);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) {
-    return new XorIntLit8(dest, left, constant);
+  public DexInstruction CreateIntLit8(int dest, int left, int constant) {
+    return new DexXorIntLit8(dest, left, constant);
   }
 
   @Override
-  public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) {
-    return new XorIntLit16(dest, left, constant);
+  public DexInstruction CreateIntLit16(int dest, int left, int constant) {
+    return new DexXorIntLit16(dest, left, constant);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/ArrayFilledDataPayloadResolver.java b/src/main/java/com/android/tools/r8/ir/conversion/ArrayFilledDataPayloadResolver.java
index 4f91695..739fb9f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/ArrayFilledDataPayloadResolver.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/ArrayFilledDataPayloadResolver.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.ir.conversion;
 
-import com.android.tools.r8.code.FillArrayData;
-import com.android.tools.r8.code.FillArrayDataPayload;
+import com.android.tools.r8.dex.code.DexFillArrayData;
+import com.android.tools.r8.dex.code.DexFillArrayDataPayload;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -20,21 +20,21 @@
     public short[] data;
   }
 
-  private final Map<Integer, FillArrayDataPayload> unresolvedPayload = new HashMap<>();
+  private final Map<Integer, DexFillArrayDataPayload> unresolvedPayload = new HashMap<>();
   private final Map<Integer, PayloadData> payloadToData = new HashMap<>();
 
-  public void addPayloadUser(FillArrayData dex) {
+  public void addPayloadUser(DexFillArrayData dex) {
     int offset = dex.getOffset();
     int payloadOffset = offset + dex.getPayloadOffset();
     assert !payloadToData.containsKey(payloadOffset);
     payloadToData.put(payloadOffset, new PayloadData());
     if (unresolvedPayload.containsKey(payloadOffset)) {
-      FillArrayDataPayload payload = unresolvedPayload.remove(payloadOffset);
+      DexFillArrayDataPayload payload = unresolvedPayload.remove(payloadOffset);
       resolve(payload);
     }
   }
 
-  public void resolve(FillArrayDataPayload payload) {
+  public void resolve(DexFillArrayDataPayload payload) {
     int payloadOffset = payload.getOffset();
     PayloadData data = payloadToData.get(payloadOffset);
     if (data == null) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
index de631d3..201c789 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
@@ -3,37 +3,38 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.conversion;
 
-import com.android.tools.r8.code.FillArrayData;
-import com.android.tools.r8.code.FillArrayDataPayload;
-import com.android.tools.r8.code.Format31t;
-import com.android.tools.r8.code.Goto;
-import com.android.tools.r8.code.Goto16;
-import com.android.tools.r8.code.Goto32;
-import com.android.tools.r8.code.IfEq;
-import com.android.tools.r8.code.IfEqz;
-import com.android.tools.r8.code.IfGe;
-import com.android.tools.r8.code.IfGez;
-import com.android.tools.r8.code.IfGt;
-import com.android.tools.r8.code.IfGtz;
-import com.android.tools.r8.code.IfLe;
-import com.android.tools.r8.code.IfLez;
-import com.android.tools.r8.code.IfLt;
-import com.android.tools.r8.code.IfLtz;
-import com.android.tools.r8.code.IfNe;
-import com.android.tools.r8.code.IfNez;
-import com.android.tools.r8.code.InstanceOf;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.Move16;
-import com.android.tools.r8.code.MoveFrom16;
-import com.android.tools.r8.code.MoveObject;
-import com.android.tools.r8.code.MoveObject16;
-import com.android.tools.r8.code.MoveObjectFrom16;
-import com.android.tools.r8.code.MoveWide;
-import com.android.tools.r8.code.MoveWide16;
-import com.android.tools.r8.code.MoveWideFrom16;
-import com.android.tools.r8.code.Nop;
-import com.android.tools.r8.code.Throw;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexFillArrayData;
+import com.android.tools.r8.dex.code.DexFillArrayDataPayload;
+import com.android.tools.r8.dex.code.DexFormat31t;
+import com.android.tools.r8.dex.code.DexGoto;
+import com.android.tools.r8.dex.code.DexGoto16;
+import com.android.tools.r8.dex.code.DexGoto32;
+import com.android.tools.r8.dex.code.DexIfEq;
+import com.android.tools.r8.dex.code.DexIfEqz;
+import com.android.tools.r8.dex.code.DexIfGe;
+import com.android.tools.r8.dex.code.DexIfGez;
+import com.android.tools.r8.dex.code.DexIfGt;
+import com.android.tools.r8.dex.code.DexIfGtz;
+import com.android.tools.r8.dex.code.DexIfLe;
+import com.android.tools.r8.dex.code.DexIfLez;
+import com.android.tools.r8.dex.code.DexIfLt;
+import com.android.tools.r8.dex.code.DexIfLtz;
+import com.android.tools.r8.dex.code.DexIfNe;
+import com.android.tools.r8.dex.code.DexIfNez;
+import com.android.tools.r8.dex.code.DexInstanceOf;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexMove;
+import com.android.tools.r8.dex.code.DexMove16;
+import com.android.tools.r8.dex.code.DexMoveFrom16;
+import com.android.tools.r8.dex.code.DexMoveObject;
+import com.android.tools.r8.dex.code.DexMoveObject16;
+import com.android.tools.r8.dex.code.DexMoveObjectFrom16;
+import com.android.tools.r8.dex.code.DexMoveWide;
+import com.android.tools.r8.dex.code.DexMoveWide16;
+import com.android.tools.r8.dex.code.DexMoveWideFrom16;
+import com.android.tools.r8.dex.code.DexNop;
+import com.android.tools.r8.dex.code.DexThrow;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.DebugLocalInfo;
 import com.android.tools.r8.graph.DexCode;
@@ -86,7 +87,7 @@
   private final IRCode ir;
 
   // Extra information that should be attached to the bytecode instructions.
-  private final BytecodeMetadata.Builder<Instruction> bytecodeMetadataBuilder;
+  private final BytecodeMetadata.Builder<DexInstruction> bytecodeMetadataBuilder;
 
   // The register allocator providing register assignments for the code to build.
   private final RegisterAllocator registerAllocator;
@@ -236,7 +237,7 @@
 
     // Build instructions.
     DexDebugEventBuilder debugEventBuilder = new DexDebugEventBuilder(ir, options);
-    List<Instruction> dexInstructions = new ArrayList<>(numberOfInstructions);
+    List<DexInstruction> dexInstructions = new ArrayList<>(numberOfInstructions);
     int instructionOffset = 0;
     for (com.android.tools.r8.ir.code.Instruction irInstruction : ir.instructions()) {
       Info info = getInfo(irInstruction);
@@ -244,7 +245,7 @@
       info.addInstructions(this, dexInstructions);
       int instructionStartOffset = instructionOffset;
       while (previousInstructionCount < dexInstructions.size()) {
-        Instruction dexInstruction = dexInstructions.get(previousInstructionCount++);
+        DexInstruction dexInstruction = dexInstructions.get(previousInstructionCount++);
         dexInstruction.setOffset(instructionOffset);
         instructionOffset += dexInstruction.getSize();
       }
@@ -257,7 +258,7 @@
     // We could have also changed the block order, however, moving the throwing block higher
     // led to larger code in all experiments (multiple gmscore version and R8 run on itself).
     if (options.canHaveTracingPastInstructionsStreamBug()
-        && dexInstructions.get(dexInstructions.size() - 1) instanceof Throw
+        && dexInstructions.get(dexInstructions.size() - 1) instanceof DexThrow
         && hasBackwardsBranch) {
       // This is the last in a series of different workarounds tried out.
       // Having an empty non reachable loop make some mediatek vms crash: b/119895393
@@ -275,12 +276,12 @@
       // That way we have no unreachable code, and we never end in a throw. The tracer will still
       // trace to the throw, but after moving to the second goto it will trace back again and see
       // an instruction it has already seen.
-      Instruction throwInstruction = dexInstructions.get(dexInstructions.size() -1);
+      DexInstruction throwInstruction = dexInstructions.get(dexInstructions.size() - 1);
       offset = throwInstruction.getOffset();
 
       // Generate the new forward and backward gotos, update offsets.
-      Instruction forward = new Goto(throwInstruction.getSize() + Goto.SIZE);
-      Instruction backward = new Goto(-throwInstruction.getSize());
+      DexInstruction forward = new DexGoto(throwInstruction.getSize() + DexGoto.SIZE);
+      DexInstruction backward = new DexGoto(-throwInstruction.getSize());
       forward.setOffset(offset);
       offset += forward.getSize();
       throwInstruction.setOffset(offset);
@@ -298,12 +299,12 @@
     for (SwitchPayloadInfo switchPayloadInfo : switchPayloadInfos) {
       // Align payloads at even addresses.
       if (offset % 2 != 0) {
-        Nop nop = new Nop();
+        DexNop nop = new DexNop();
         nop.setOffset(offset++);
         dexInstructions.add(nop);
       }
       // Create payload and add it to the instruction stream.
-      Nop payload = createSwitchPayload(switchPayloadInfo, offset);
+      DexNop payload = createSwitchPayload(switchPayloadInfo, offset);
       payload.setOffset(offset);
       offset += payload.getSize();
       dexInstructions.add(payload);
@@ -313,12 +314,12 @@
     for (FillArrayDataInfo info : fillArrayDataInfos) {
       // Align payloads at even addresses.
       if (offset % 2 != 0) {
-        Nop nop = new Nop();
+        DexNop nop = new DexNop();
         nop.setOffset(offset++);
         dexInstructions.add(nop);
       }
       // Create payload and add it to the instruction stream.
-      FillArrayDataPayload payload = info.ir.createPayload();
+      DexFillArrayDataPayload payload = info.ir.createPayload();
       payload.setOffset(offset);
       info.dex.setPayloadOffset(offset - info.dex.getOffset());
       offset += payload.getSize();
@@ -334,7 +335,7 @@
             registerAllocator.registersUsed(),
             inRegisterCount,
             outRegisterCount,
-            dexInstructions.toArray(Instruction.EMPTY_ARRAY),
+            dexInstructions.toArray(DexInstruction.EMPTY_ARRAY),
             tryInfo.tries,
             tryInfo.handlers,
             debugEventBuilder.build(),
@@ -584,7 +585,7 @@
     }
   }
 
-  private boolean needsNopBetweenMoveAndInstanceOf(InstanceOf instanceOf) {
+  private boolean needsNopBetweenMoveAndInstanceOf(DexInstanceOf instanceOf) {
     if (!options.canHaveArtInstanceOfVerifierBug()) {
       return false;
     }
@@ -608,9 +609,9 @@
     return false;
   }
 
-  public void addInstanceOf(com.android.tools.r8.ir.code.InstanceOf ir, InstanceOf instanceOf) {
+  public void addInstanceOf(com.android.tools.r8.ir.code.InstanceOf ir, DexInstanceOf instanceOf) {
     if (needsNopBetweenMoveAndInstanceOf(instanceOf)) {
-      add(ir, new Nop(), instanceOf);
+      add(ir, new DexNop(), instanceOf);
     } else {
       add(ir, instanceOf);
     }
@@ -645,7 +646,7 @@
   }
 
   public void addNop(com.android.tools.r8.ir.code.Instruction ir) {
-    add(ir, new FixedSizeInfo(ir, new Nop()));
+    add(ir, new FixedSizeInfo(ir, new DexNop()));
   }
 
   public void addDebugPosition(DebugPosition position) {
@@ -654,24 +655,24 @@
     addNop(position);
   }
 
-  public void add(com.android.tools.r8.ir.code.Instruction instr, Instruction dex) {
+  public void add(com.android.tools.r8.ir.code.Instruction instr, DexInstruction dex) {
     assert !instr.isGoto();
     add(instr, new FixedSizeInfo(instr, dex));
     bytecodeMetadataBuilder.setMetadata(instr, dex);
   }
 
-  public void add(com.android.tools.r8.ir.code.Instruction ir, Instruction... dex) {
+  public void add(com.android.tools.r8.ir.code.Instruction ir, DexInstruction... dex) {
     assert !ir.isGoto();
     add(ir, new MultiFixedSizeInfo(ir, dex));
   }
 
-  public void addSwitch(IntSwitch s, Format31t dex) {
+  public void addSwitch(IntSwitch s, DexFormat31t dex) {
     assert nextBlock == s.fallthroughBlock();
     switchPayloadInfos.add(new SwitchPayloadInfo(s, dex));
     add(s, dex);
   }
 
-  public void addFillArrayData(NewArrayFilledData nafd, FillArrayData dex) {
+  public void addFillArrayData(NewArrayFilledData nafd, DexFillArrayData dex) {
     fillArrayDataInfos.add(new FillArrayDataInfo(nafd, dex));
     add(nafd, dex);
   }
@@ -681,7 +682,7 @@
     add(argument, new FallThroughInfo(argument));
   }
 
-  public void addReturn(Return ret, Instruction dex) {
+  public void addReturn(Return ret, DexInstruction dex) {
     if (nextBlock != null
         && ret.identicalAfterRegisterAllocation(
             nextBlock.entry(), registerAllocator, conversionOptions)) {
@@ -759,7 +760,7 @@
   }
 
   // Helper for computing switch payloads.
-  private Nop createSwitchPayload(SwitchPayloadInfo info, int offset) {
+  private DexNop createSwitchPayload(SwitchPayloadInfo info, int offset) {
     IntSwitch ir = info.ir;
     // Patch the payload offset in the generated switch instruction now
     // that the location is known.
@@ -951,7 +952,7 @@
 
     // Materialize the actual construction.
     // All instruction offsets are known at this point.
-    public abstract void addInstructions(DexBuilder builder, List<Instruction> instructions);
+    public abstract void addInstructions(DexBuilder builder, List<DexInstruction> instructions);
 
     // Lower bound on the size of the instruction.
     public abstract int minSize();
@@ -1000,9 +1001,9 @@
 
   private static class FixedSizeInfo extends Info {
 
-    private final Instruction instruction;
+    private final DexInstruction instruction;
 
-    public FixedSizeInfo(com.android.tools.r8.ir.code.Instruction ir, Instruction instruction) {
+    public FixedSizeInfo(com.android.tools.r8.ir.code.Instruction ir, DexInstruction instruction) {
       super(ir);
       this.instruction = instruction;
     }
@@ -1029,7 +1030,7 @@
     }
 
     @Override
-    public void addInstructions(DexBuilder builder, List<Instruction> instructions) {
+    public void addInstructions(DexBuilder builder, List<DexInstruction> instructions) {
       instructions.add(instruction);
     }
 
@@ -1042,15 +1043,15 @@
 
   private static class MultiFixedSizeInfo extends Info {
 
-    private final Instruction[] instructions;
+    private final DexInstruction[] instructions;
     private final int size;
 
-    public MultiFixedSizeInfo(com.android.tools.r8.ir.code.Instruction ir,
-        Instruction[] instructions) {
+    public MultiFixedSizeInfo(
+        com.android.tools.r8.ir.code.Instruction ir, DexInstruction[] instructions) {
       super(ir);
       this.instructions = instructions;
       int size = 0;
-      for (Instruction instruction : instructions) {
+      for (DexInstruction instruction : instructions) {
         size += instruction.getSize();
       }
       this.size = size;
@@ -1062,9 +1063,9 @@
     }
 
     @Override
-    public void addInstructions(DexBuilder builder, List<Instruction> instructions) {
+    public void addInstructions(DexBuilder builder, List<DexInstruction> instructions) {
       int offset = getOffset();
-      for (Instruction instruction : this.instructions) {
+      for (DexInstruction instruction : this.instructions) {
         instructions.add(instruction);
         instruction.setOffset(offset);
         offset += instruction.getSize();
@@ -1110,8 +1111,7 @@
     }
 
     @Override
-    public void addInstructions(DexBuilder builder, List<Instruction> instructions) {
-    }
+    public void addInstructions(DexBuilder builder, List<DexInstruction> instructions) {}
 
     @Override
     public int minSize() {
@@ -1149,13 +1149,13 @@
 
     @Override
     public int minSize() {
-      assert new Goto(42).getSize() == 1;
+      assert new DexGoto(42).getSize() == 1;
       return 1;
     }
 
     @Override
     public int maxSize() {
-      assert new Goto32(0).getSize() == 3;
+      assert new DexGoto32(0).getSize() == 3;
       return 3;
     }
 
@@ -1201,7 +1201,7 @@
     }
 
     @Override
-    public void addInstructions(DexBuilder builder, List<Instruction> instructions) {
+    public void addInstructions(DexBuilder builder, List<DexInstruction> instructions) {
       com.android.tools.r8.ir.code.Goto jump = getJump();
       int source = builder.getInfo(jump).getOffset();
       Info targetInfo = builder.getTargetInfo(jump.getTarget());
@@ -1213,7 +1213,7 @@
       // size of this instruction.
       Return ret = targetInfo.getIR().asReturn();
       if (ret != null && size == targetInfo.getSize() && ret.getPosition().isNone()) {
-        Instruction dex = ret.createDexInstruction(builder);
+        DexInstruction dex = ret.createDexInstruction(builder);
         dex.setOffset(getOffset()); // for better printing of the dex code.
         instructions.add(dex);
       } else if (size == relativeOffset) {
@@ -1222,29 +1222,29 @@
         // jit crashes on 'goto next instruction' on Android 4.1.1.
         // TODO(b/34726595): We currently do hit this case and we should see if we can avoid that.
         for (int i = 0; i < size; i++) {
-          Instruction dex = new Nop();
+          DexInstruction dex = new DexNop();
           assert dex.getSize() == 1;
           dex.setOffset(getOffset() + i); // for better printing of the dex code.
           instructions.add(dex);
         }
       } else {
-        Instruction dex;
+        DexInstruction dex;
         switch (size) {
           case 1:
             assert relativeOffset != 0;
-            dex = new Goto(relativeOffset);
+            dex = new DexGoto(relativeOffset);
             break;
           case 2:
             if (relativeOffset == 0) {
-              Nop nop = new Nop();
+              DexNop nop = new DexNop();
               instructions.add(nop);
-              dex = new Goto(-nop.getSize());
+              dex = new DexGoto(-nop.getSize());
             } else {
-              dex = new Goto16(relativeOffset);
+              dex = new DexGoto16(relativeOffset);
             }
             break;
           case 3:
-            dex = new Goto32(relativeOffset);
+            dex = new DexGoto32(relativeOffset);
             break;
           default:
             throw new Unreachable("Unexpected size for goto instruction: " + size);
@@ -1307,7 +1307,7 @@
     }
 
     @Override
-    public void addInstructions(DexBuilder builder, List<Instruction> instructions) {
+    public void addInstructions(DexBuilder builder, List<DexInstruction> instructions) {
       If branch = getBranch();
       int source = builder.getInfo(branch).getOffset();
       int target = builder.getInfo(branch.getTrueTarget().entry()).getOffset();
@@ -1320,53 +1320,53 @@
 
       if (size == 3) {
         assert branchesToSelf(builder);
-        Nop nop = new Nop();
+        DexNop nop = new DexNop();
         relativeOffset -= nop.getSize();
         instructions.add(nop);
       }
       assert relativeOffset != 0;
-      Instruction instruction = null;
+      DexInstruction instruction = null;
       if (branch.isZeroTest()) {
         switch (getBranch().getType()) {
           case EQ:
-            instruction = new IfEqz(register1, relativeOffset);
+            instruction = new DexIfEqz(register1, relativeOffset);
             break;
           case GE:
-            instruction = new IfGez(register1, relativeOffset);
+            instruction = new DexIfGez(register1, relativeOffset);
             break;
           case GT:
-            instruction = new IfGtz(register1, relativeOffset);
+            instruction = new DexIfGtz(register1, relativeOffset);
             break;
           case LE:
-            instruction = new IfLez(register1, relativeOffset);
+            instruction = new DexIfLez(register1, relativeOffset);
             break;
           case LT:
-            instruction = new IfLtz(register1, relativeOffset);
+            instruction = new DexIfLtz(register1, relativeOffset);
             break;
           case NE:
-            instruction = new IfNez(register1, relativeOffset);
+            instruction = new DexIfNez(register1, relativeOffset);
             break;
         }
       } else {
         int register2 = getRegister(1, builder);
         switch (getBranch().getType()) {
           case EQ:
-            instruction = new IfEq(register1, register2, relativeOffset);
+            instruction = new DexIfEq(register1, register2, relativeOffset);
             break;
           case GE:
-            instruction = new IfGe(register1, register2, relativeOffset);
+            instruction = new DexIfGe(register1, register2, relativeOffset);
             break;
           case GT:
-            instruction = new IfGt(register1, register2, relativeOffset);
+            instruction = new DexIfGt(register1, register2, relativeOffset);
             break;
           case LE:
-            instruction = new IfLe(register1, register2, relativeOffset);
+            instruction = new DexIfLe(register1, register2, relativeOffset);
             break;
           case LT:
-            instruction = new IfLt(register1, register2, relativeOffset);
+            instruction = new DexIfLt(register1, register2, relativeOffset);
             break;
           case NE:
-            instruction = new IfNe(register1, register2, relativeOffset);
+            instruction = new DexIfNe(register1, register2, relativeOffset);
             break;
         }
       }
@@ -1456,46 +1456,46 @@
     }
 
     @Override
-    public void addInstructions(DexBuilder builder, List<Instruction> instructions) {
+    public void addInstructions(DexBuilder builder, List<DexInstruction> instructions) {
       Move move = getMove();
       TypeElement moveType = move.getOutType();
       int src = srcRegister(builder);
       int dest = destRegister(builder);
-      Instruction instruction;
+      DexInstruction instruction;
       switch (size) {
         case 1:
           if (src == dest) {
-            instruction = new Nop();
+            instruction = new DexNop();
             break;
           }
           if (moveType.isSinglePrimitive()) {
-            instruction = new com.android.tools.r8.code.Move(dest, src);
+            instruction = new DexMove(dest, src);
           } else if (moveType.isWidePrimitive()) {
-            instruction = new MoveWide(dest, src);
+            instruction = new DexMoveWide(dest, src);
           } else if (moveType.isReferenceType()) {
-            instruction = new MoveObject(dest, src);
+            instruction = new DexMoveObject(dest, src);
           } else {
             throw new Unreachable("Unexpected type: " + move.outType());
           }
           break;
         case 2:
           if (moveType.isSinglePrimitive()) {
-            instruction = new MoveFrom16(dest, src);
+            instruction = new DexMoveFrom16(dest, src);
           } else if (moveType.isWidePrimitive()) {
-            instruction = new MoveWideFrom16(dest, src);
+            instruction = new DexMoveWideFrom16(dest, src);
           } else if (moveType.isReferenceType()) {
-            instruction = new MoveObjectFrom16(dest, src);
+            instruction = new DexMoveObjectFrom16(dest, src);
           } else {
             throw new Unreachable("Unexpected type: " + move.outType());
           }
           break;
         case 3:
           if (moveType.isSinglePrimitive()) {
-            instruction = new Move16(dest, src);
+            instruction = new DexMove16(dest, src);
           } else if (moveType.isWidePrimitive()) {
-            instruction = new MoveWide16(dest, src);
+            instruction = new DexMoveWide16(dest, src);
           } else if (moveType.isReferenceType()) {
-            instruction = new MoveObject16(dest, src);
+            instruction = new DexMoveObject16(dest, src);
           } else {
             throw new Unreachable("Unexpected type: " + move.outType());
           }
@@ -1509,13 +1509,13 @@
 
     @Override
     public int minSize() {
-      assert new Nop().getSize() == 1 && new com.android.tools.r8.code.Move(0, 0).getSize() == 1;
+      assert new DexNop().getSize() == 1 && new DexMove(0, 0).getSize() == 1;
       return 1;
     }
 
     @Override
     public int maxSize() {
-      assert new Move16(0, 0).getSize() == 3;
+      assert new DexMove16(0, 0).getSize() == 3;
       return 3;
     }
 
@@ -1560,9 +1560,9 @@
   private static class SwitchPayloadInfo {
 
     public final IntSwitch ir;
-    public final Format31t dex;
+    public final DexFormat31t dex;
 
-    public SwitchPayloadInfo(IntSwitch ir, Format31t dex) {
+    public SwitchPayloadInfo(IntSwitch ir, DexFormat31t dex) {
       this.ir = ir;
       this.dex = dex;
     }
@@ -1571,9 +1571,9 @@
   private static class FillArrayDataInfo {
 
     public final NewArrayFilledData ir;
-    public final FillArrayData dex;
+    public final DexFillArrayData dex;
 
-    public FillArrayDataInfo(NewArrayFilledData ir, FillArrayData dex) {
+    public FillArrayDataInfo(NewArrayFilledData ir, DexFillArrayData dex) {
       this.ir = ir;
       this.dex = dex;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
index a8d0ccd..3fbcdc8 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
@@ -4,31 +4,31 @@
 
 package com.android.tools.r8.ir.conversion;
 
-import com.android.tools.r8.code.FillArrayData;
-import com.android.tools.r8.code.FillArrayDataPayload;
-import com.android.tools.r8.code.FilledNewArray;
-import com.android.tools.r8.code.FilledNewArrayRange;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.InvokeCustom;
-import com.android.tools.r8.code.InvokeCustomRange;
-import com.android.tools.r8.code.InvokeDirect;
-import com.android.tools.r8.code.InvokeDirectRange;
-import com.android.tools.r8.code.InvokeInterface;
-import com.android.tools.r8.code.InvokeInterfaceRange;
-import com.android.tools.r8.code.InvokePolymorphic;
-import com.android.tools.r8.code.InvokePolymorphicRange;
-import com.android.tools.r8.code.InvokeStatic;
-import com.android.tools.r8.code.InvokeStaticRange;
-import com.android.tools.r8.code.InvokeSuper;
-import com.android.tools.r8.code.InvokeSuperRange;
-import com.android.tools.r8.code.InvokeVirtual;
-import com.android.tools.r8.code.InvokeVirtualRange;
-import com.android.tools.r8.code.MoveException;
-import com.android.tools.r8.code.MoveResult;
-import com.android.tools.r8.code.MoveResultObject;
-import com.android.tools.r8.code.MoveResultWide;
-import com.android.tools.r8.code.SwitchPayload;
-import com.android.tools.r8.code.Throw;
+import com.android.tools.r8.dex.code.DexFillArrayData;
+import com.android.tools.r8.dex.code.DexFillArrayDataPayload;
+import com.android.tools.r8.dex.code.DexFilledNewArray;
+import com.android.tools.r8.dex.code.DexFilledNewArrayRange;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeCustom;
+import com.android.tools.r8.dex.code.DexInvokeCustomRange;
+import com.android.tools.r8.dex.code.DexInvokeDirect;
+import com.android.tools.r8.dex.code.DexInvokeDirectRange;
+import com.android.tools.r8.dex.code.DexInvokeInterface;
+import com.android.tools.r8.dex.code.DexInvokeInterfaceRange;
+import com.android.tools.r8.dex.code.DexInvokePolymorphic;
+import com.android.tools.r8.dex.code.DexInvokePolymorphicRange;
+import com.android.tools.r8.dex.code.DexInvokeStatic;
+import com.android.tools.r8.dex.code.DexInvokeStaticRange;
+import com.android.tools.r8.dex.code.DexInvokeSuper;
+import com.android.tools.r8.dex.code.DexInvokeSuperRange;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
+import com.android.tools.r8.dex.code.DexInvokeVirtualRange;
+import com.android.tools.r8.dex.code.DexMoveException;
+import com.android.tools.r8.dex.code.DexMoveResult;
+import com.android.tools.r8.dex.code.DexMoveResultObject;
+import com.android.tools.r8.dex.code.DexMoveResultWide;
+import com.android.tools.r8.dex.code.DexSwitchPayload;
+import com.android.tools.r8.dex.code.DexThrow;
 import com.android.tools.r8.graph.DebugLocalInfo;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexCode.Try;
@@ -66,7 +66,7 @@
 
   private Try currentTryRange = null;
   private CatchHandlers<Integer> currentCatchHandlers = null;
-  private Instruction currentDexInstruction = null;
+  private DexInstruction currentDexInstruction = null;
   private boolean isBuildingPrelude;
 
   private Position currentPosition = null;
@@ -126,13 +126,13 @@
   public void setUp() {
     // Collect all payloads in the instruction stream.
     for (int index = 0; index < code.instructions.length; index++) {
-      Instruction insn = code.instructions[index];
+      DexInstruction insn = code.instructions[index];
       offsetToInstructionIndex.put(insn.getOffset(), index);
       if (insn.isPayload()) {
         if (insn.isSwitchPayload()) {
-          switchPayloadResolver.resolve((SwitchPayload) insn);
+          switchPayloadResolver.resolve((DexSwitchPayload) insn);
         } else {
-          arrayFilledDataPayloadResolver.resolve((FillArrayDataPayload) insn);
+          arrayFilledDataPayloadResolver.resolve((DexFillArrayDataPayload) insn);
         }
       }
     }
@@ -183,9 +183,9 @@
 
   @Override
   public int getMoveExceptionRegister(int instructionIndex) {
-    Instruction instruction = code.instructions[instructionIndex];
-    if (instruction instanceof MoveException) {
-      MoveException moveException = (MoveException) instruction;
+    DexInstruction instruction = code.instructions[instructionIndex];
+    if (instruction instanceof DexMoveException) {
+      DexMoveException moveException = (DexMoveException) instruction;
       return moveException.AA;
     }
     return -1;
@@ -297,38 +297,38 @@
         arrayFilledDataPayloadResolver.getData(payloadOffset));
   }
 
-  private boolean isInvoke(Instruction dex) {
-    return dex instanceof InvokeCustom
-        || dex instanceof InvokeCustomRange
-        || dex instanceof InvokeDirect
-        || dex instanceof InvokeDirectRange
-        || dex instanceof InvokeVirtual
-        || dex instanceof InvokeVirtualRange
-        || dex instanceof InvokeInterface
-        || dex instanceof InvokeInterfaceRange
-        || dex instanceof InvokeStatic
-        || dex instanceof InvokeStaticRange
-        || dex instanceof InvokeSuper
-        || dex instanceof InvokeSuperRange
-        || dex instanceof InvokePolymorphic
-        || dex instanceof InvokePolymorphicRange
-        || dex instanceof FilledNewArray
-        || dex instanceof FilledNewArrayRange;
+  private boolean isInvoke(DexInstruction dex) {
+    return dex instanceof DexInvokeCustom
+        || dex instanceof DexInvokeCustomRange
+        || dex instanceof DexInvokeDirect
+        || dex instanceof DexInvokeDirectRange
+        || dex instanceof DexInvokeVirtual
+        || dex instanceof DexInvokeVirtualRange
+        || dex instanceof DexInvokeInterface
+        || dex instanceof DexInvokeInterfaceRange
+        || dex instanceof DexInvokeStatic
+        || dex instanceof DexInvokeStaticRange
+        || dex instanceof DexInvokeSuper
+        || dex instanceof DexInvokeSuperRange
+        || dex instanceof DexInvokePolymorphic
+        || dex instanceof DexInvokePolymorphicRange
+        || dex instanceof DexFilledNewArray
+        || dex instanceof DexFilledNewArrayRange;
   }
 
-  private boolean isMoveResult(Instruction dex) {
-    return dex instanceof MoveResult
-        || dex instanceof MoveResultObject
-        || dex instanceof MoveResultWide;
+  private boolean isMoveResult(DexInstruction dex) {
+    return dex instanceof DexMoveResult
+        || dex instanceof DexMoveResultObject
+        || dex instanceof DexMoveResultWide;
   }
 
   @Override
   public int traceInstruction(int index, IRBuilder builder) {
-    Instruction dex = code.instructions[index];
+    DexInstruction dex = code.instructions[index];
     int offset = dex.getOffset();
     assert !dex.isPayload();
     int[] targets = dex.getTargets();
-    if (targets != Instruction.NO_TARGETS) {
+    if (targets != DexInstruction.NO_TARGETS) {
       // Check that we don't ever have instructions that can throw and have targets.
       assert !dex.canThrow();
       for (int relativeOffset : targets) {
@@ -339,7 +339,7 @@
     if (dex.canThrow()) {
       // TODO(zerny): Remove this from block computation.
       if (dex.hasPayload()) {
-        arrayFilledDataPayloadResolver.addPayloadUser((FillArrayData) dex);
+        arrayFilledDataPayloadResolver.addPayloadUser((DexFillArrayData) dex);
       }
       // If the instruction can throw and is in a try block, add edges to its catch successors.
       Try tryRange = getTryForOffset(offset);
@@ -366,13 +366,13 @@
           dex = code.instructions[index];
         }
         // Edge to normal successor if any (fallthrough).
-        if (!(dex instanceof Throw)) {
+        if (!(dex instanceof DexThrow)) {
           builder.ensureNormalSuccessorBlock(offset, dex.getOffset() + dex.getSize());
         }
         return index;
       }
       // Close the block if the instruction is a throw, otherwise the block remains open.
-      return dex instanceof Throw ? index : -1;
+      return dex instanceof DexThrow ? index : -1;
     }
     if (dex.isIntSwitch()) {
       // TODO(zerny): Remove this from block computation.
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/SwitchPayloadResolver.java b/src/main/java/com/android/tools/r8/ir/conversion/SwitchPayloadResolver.java
index 39e494d..fb2709f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/SwitchPayloadResolver.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/SwitchPayloadResolver.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.ir.conversion;
 
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.SwitchPayload;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexSwitchPayload;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
@@ -28,20 +28,20 @@
     }
   }
 
-  private final Map<Integer, SwitchPayload> unresolvedPayload = new HashMap<>();
+  private final Map<Integer, DexSwitchPayload> unresolvedPayload = new HashMap<>();
   private final Map<Integer, PayloadData> payloadToData = new HashMap<>();
 
-  public void addPayloadUser(Instruction dex) {
+  public void addPayloadUser(DexInstruction dex) {
     int offset = dex.getOffset();
     int payloadOffset = offset + dex.getPayloadOffset();
     payloadToData.put(payloadOffset, new PayloadData(offset));
     if (unresolvedPayload.containsKey(payloadOffset)) {
-      SwitchPayload payload = unresolvedPayload.remove(payloadOffset);
+      DexSwitchPayload payload = unresolvedPayload.remove(payloadOffset);
       resolve(payload);
     }
   }
 
-  public void resolve(SwitchPayload payload) {
+  public void resolve(DexSwitchPayload payload) {
     int payloadOffset = payload.getOffset();
     PayloadData data = payloadToData.get(payloadOffset);
     if (data == null) {
@@ -59,7 +59,7 @@
     data.size = payload.numberOfKeys();
   }
 
-  public int[] absoluteTargets(Instruction dex) {
+  public int[] absoluteTargets(DexInstruction dex) {
     assert dex.isIntSwitch();
     return absoluteTargets(dex.getOffset() + dex.getPayloadOffset());
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
index f963a21..89a9163 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
@@ -6,8 +6,8 @@
 
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.InvokeSuper;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeSuper;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.Code;
@@ -193,8 +193,8 @@
     Code code = method.getDefinition().getCode();
     assert code != null;
     if (code.isDexCode()) {
-      for (Instruction insn : code.asDexCode().instructions) {
-        if (insn instanceof InvokeSuper) {
+      for (DexInstruction insn : code.asDexCode().instructions) {
+        if (insn instanceof DexInvokeSuper) {
           return false;
         }
       }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index 3788e98..107bd20 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -7,9 +7,9 @@
 import static com.android.tools.r8.ir.optimize.inliner.InlinerUtils.collectAllMonitorEnterValues;
 import static com.android.tools.r8.utils.AndroidApiLevelUtils.isApiSafeForInlining;
 
-import com.android.tools.r8.code.MoveResult;
-import com.android.tools.r8.code.MoveResultObject;
-import com.android.tools.r8.code.MoveResultWide;
+import com.android.tools.r8.dex.code.DexMoveResult;
+import com.android.tools.r8.dex.code.DexMoveResultObject;
+import com.android.tools.r8.dex.code.DexMoveResultWide;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
 import com.android.tools.r8.graph.AppView;
@@ -245,9 +245,9 @@
     if (appView.options().isGeneratingDex()
         && invoke.hasOutValue()
         && invoke.outValue().hasNonDebugUsers()) {
-      assert MoveResult.SIZE == MoveResultObject.SIZE;
-      assert MoveResult.SIZE == MoveResultWide.SIZE;
-      instructionLimit += MoveResult.SIZE;
+      assert DexMoveResult.SIZE == DexMoveResultObject.SIZE;
+      assert DexMoveResult.SIZE == DexMoveResultWide.SIZE;
+      instructionLimit += DexMoveResult.SIZE;
     }
     return instructionLimit;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerCostAnalysis.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerCostAnalysis.java
index 93b5d8f..12028fb 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerCostAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerCostAnalysis.java
@@ -9,9 +9,9 @@
 import static com.android.tools.r8.ir.code.Opcodes.INSTANCE_PUT;
 import static com.android.tools.r8.ir.code.Opcodes.RETURN;
 
-import com.android.tools.r8.code.Iget;
-import com.android.tools.r8.code.Iput;
-import com.android.tools.r8.code.Return;
+import com.android.tools.r8.dex.code.DexIget;
+import com.android.tools.r8.dex.code.DexIput;
+import com.android.tools.r8.dex.code.DexReturn;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.ProgramMethod;
@@ -130,7 +130,7 @@
             if (appView.options().isGeneratingClassFiles()) {
               result++;
             } else {
-              result += instruction.isInstanceGet() ? Iget.SIZE : Iput.SIZE;
+              result += instruction.isInstanceGet() ? DexIget.SIZE : DexIput.SIZE;
             }
           }
           break;
@@ -140,7 +140,7 @@
           if (appView.options().isGeneratingClassFiles()) {
             result++;
           } else {
-            result += Return.SIZE;
+            result += DexReturn.SIZE;
           }
           break;
 
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
index 0ad986c..ada07f6 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
@@ -8,9 +8,9 @@
 import com.android.tools.r8.cf.code.CfConstString;
 import com.android.tools.r8.cf.code.CfDexItemBasedConstString;
 import com.android.tools.r8.cf.code.CfInstruction;
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.DexItemBasedConstString;
-import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.code.DexConstString;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexItemBasedConstString;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexClass;
@@ -91,9 +91,9 @@
       return;
     }
     if (code.isDexCode()) {
-      for (Instruction instruction : code.asDexCode().instructions) {
+      for (DexInstruction instruction : code.asDexCode().instructions) {
         if (instruction.isConstString()) {
-          ConstString cnst = instruction.asConstString();
+          DexConstString cnst = instruction.asConstString();
           cnst.BBBB = getRenamedStringLiteral(cnst.getString());
         }
       }
@@ -163,15 +163,15 @@
     Code code = programMethod.getDefinition().getCode();
     assert code != null;
     if (code.isDexCode()) {
-      Instruction[] instructions = code.asDexCode().instructions;
+      DexInstruction[] instructions = code.asDexCode().instructions;
       for (int i = 0; i < instructions.length; ++i) {
-        Instruction instruction = instructions[i];
+        DexInstruction instruction = instructions[i];
         if (instruction.isDexItemBasedConstString()) {
           DexItemBasedConstString cnst = instruction.asDexItemBasedConstString();
           DexString replacement =
               cnst.getNameComputationInfo()
                   .computeNameFor(cnst.getItem(), appView, appView.graphLens(), lens);
-          ConstString constString = new ConstString(cnst.AA, replacement);
+          DexConstString constString = new DexConstString(cnst.AA, replacement);
           constString.setOffset(instruction.getOffset());
           instructions[i] = constString;
         }
diff --git a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java
index f640d08..09966ca 100644
--- a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java
+++ b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java
@@ -7,9 +7,9 @@
 
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.InvokeVirtual;
-import com.android.tools.r8.code.InvokeVirtualRange;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
+import com.android.tools.r8.dex.code.DexInvokeVirtualRange;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.BottomUpClassHierarchyTraversal;
@@ -332,24 +332,24 @@
   }
 
   private DexCode createDexCodeForVirtualBridge(DexCode code, DexMethod methodToInvoke) {
-    Instruction[] newInstructions = new Instruction[code.instructions.length];
+    DexInstruction[] newInstructions = new DexInstruction[code.instructions.length];
     boolean modified = false;
     for (int i = 0; i < code.instructions.length; i++) {
-      Instruction instruction = code.instructions[i];
+      DexInstruction instruction = code.instructions[i];
       if (instruction.isInvokeVirtual()
           && instruction.asInvokeVirtual().getMethod() != methodToInvoke) {
-        InvokeVirtual invoke = instruction.asInvokeVirtual();
-        InvokeVirtual newInvoke =
-            new InvokeVirtual(
+        DexInvokeVirtual invoke = instruction.asInvokeVirtual();
+        DexInvokeVirtual newInvoke =
+            new DexInvokeVirtual(
                 invoke.A, methodToInvoke, invoke.C, invoke.D, invoke.E, invoke.F, invoke.G);
         newInvoke.setOffset(invoke.getOffset());
         newInstructions[i] = newInvoke;
         modified = true;
       } else if (instruction.isInvokeVirtualRange()
           && instruction.asInvokeVirtualRange().getMethod() != methodToInvoke) {
-        InvokeVirtualRange invoke = instruction.asInvokeVirtualRange();
-        InvokeVirtualRange newInvoke =
-            new InvokeVirtualRange(invoke.CCCC, invoke.AA, methodToInvoke);
+        DexInvokeVirtualRange invoke = instruction.asInvokeVirtualRange();
+        DexInvokeVirtualRange newInvoke =
+            new DexInvokeVirtualRange(invoke.CCCC, invoke.AA, methodToInvoke);
         newInvoke.setOffset(invoke.getOffset());
         modified = true;
         newInstructions[i] = newInvoke;
diff --git a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
index 597a07d..192b16a 100644
--- a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
@@ -8,7 +8,7 @@
 
 import com.android.tools.r8.androidapi.AndroidApiLevelCompute;
 import com.android.tools.r8.androidapi.ComputedApiLevel;
-import com.android.tools.r8.code.CfOrDexInstruction;
+import com.android.tools.r8.dex.code.CfOrDexInstruction;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexCallSite;
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index c93bdb3..d3f4afa 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -18,10 +18,10 @@
 import com.android.tools.r8.Diagnostic;
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.code.CfOrDexInstruction;
 import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
 import com.android.tools.r8.contexts.CompilationContext.ProcessorContext;
 import com.android.tools.r8.dex.IndexedItemCollection;
+import com.android.tools.r8.dex.code.CfOrDexInstruction;
 import com.android.tools.r8.errors.InterfaceDesugarMissingTypeDiagnostic;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.experimental.graphinfo.GraphConsumer;
diff --git a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
index 86b7c35..012f26e 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -6,8 +6,8 @@
 import com.android.tools.r8.ResourceException;
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfPosition;
-import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.debuginfo.DebugRepresentation.DebugRepresentationPredicate;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
@@ -1180,7 +1180,7 @@
     // If the method has a single non-preamble line, check that the preamble is not active on any
     // throwing instruction before the single line becomes active.
     if (singleOriginalLine.isTrue() && firstDefaultEventPc.get() > 0) {
-      for (Instruction instruction : dexCode.instructions) {
+      for (DexInstruction instruction : dexCode.instructions) {
         if (instruction.getOffset() < firstDefaultEventPc.get()) {
           if (instruction.canThrow()) {
             singleOriginalLine.set(false);
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 08e9395..d2bb3e1 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -23,8 +23,8 @@
 import com.android.tools.r8.ToolHelper.DexVm;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.cf.CfVersion;
-import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.dex.ApplicationReader;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
 import com.android.tools.r8.graph.AppInfo;
@@ -1544,7 +1544,7 @@
   }
 
   protected static void checkInstructions(
-      DexCode code, List<Class<? extends Instruction>> instructions) {
+      DexCode code, List<Class<? extends DexInstruction>> instructions) {
     assertEquals(instructions.size(), code.instructions.length);
     for (int i = 0; i < instructions.size(); ++i) {
       assertEquals("Unexpected instruction at index " + i,
@@ -1552,8 +1552,8 @@
     }
   }
 
-  protected Stream<Instruction> filterInstructionKind(
-      DexCode dexCode, Class<? extends Instruction> kind) {
+  protected Stream<DexInstruction> filterInstructionKind(
+      DexCode dexCode, Class<? extends DexInstruction> kind) {
     return Arrays.stream(dexCode.instructions)
         .filter(kind::isInstance)
         .map(kind::cast);
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
index 8a91c84..c80de82 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
@@ -13,8 +13,8 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.code.InvokeDirect;
-import com.android.tools.r8.code.InvokeVirtual;
+import com.android.tools.r8.dex.code.DexInvokeDirect;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.smali.SmaliBuilder;
@@ -111,15 +111,18 @@
         parameters.getRuntime().asDex().getVm().getVersion().isOlderThanOrEqual(Version.V4_4_4)
             ? "VerifyError"
             : "IncompatibleClassChangeError";
-    run(builder, expectedError, dexInspector -> {
-      ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
-      assertThat(clazz, isPresent());
-      DexEncodedMethod method = getMethod(dexInspector, main);
-      assertNotNull(method);
-      DexCode code = method.getCode().asDexCode();
-      // The given invoke line is remained as-is.
-      assertTrue(code.instructions[2] instanceof InvokeDirect);
-    });
+    run(
+        builder,
+        expectedError,
+        dexInspector -> {
+          ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
+          assertThat(clazz, isPresent());
+          DexEncodedMethod method = getMethod(dexInspector, main);
+          assertNotNull(method);
+          DexCode code = method.getCode().asDexCode();
+          // The given invoke line is remained as-is.
+          assertTrue(code.instructions[2] instanceof DexInvokeDirect);
+        });
   }
 
   // The following test checks invoke-direct, which refers to the private instance method, *is*
@@ -139,15 +142,18 @@
   public void invokeDirectToPublicizedMethod() throws Exception {
     SmaliBuilder builder = buildTestClass(
         "invoke-direct { v1 }, L" + CLASS_NAME + ";->foo()I");
-    run(builder, null, dexInspector -> {
-      ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
-      assertThat(clazz, isPresent());
-      DexEncodedMethod method = getMethod(dexInspector, main);
-      assertNotNull(method);
-      DexCode code = method.getCode().asDexCode();
-      // The given invoke line is changed to invoke-virtual
-      assertTrue(code.instructions[2] instanceof InvokeVirtual);
-    });
+    run(
+        builder,
+        null,
+        dexInspector -> {
+          ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
+          assertThat(clazz, isPresent());
+          DexEncodedMethod method = getMethod(dexInspector, main);
+          assertNotNull(method);
+          DexCode code = method.getCode().asDexCode();
+          // The given invoke line is changed to invoke-virtual
+          assertTrue(code.instructions[2] instanceof DexInvokeVirtual);
+        });
   }
 
 }
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java b/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
index fb4f27e..57c41a8 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
@@ -12,8 +12,8 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.code.InvokeVirtual;
-import com.android.tools.r8.code.ReturnVoid;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
+import com.android.tools.r8.dex.code.DexReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
@@ -180,13 +180,15 @@
 
               if (parameters.isDexRuntime()) {
                 DexCode code = fooFromCls2InAbsCls.getMethod().getCode().asDexCode();
-                checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class));
-                InvokeVirtual invoke = (InvokeVirtual) code.instructions[0];
+                checkInstructions(
+                    code, ImmutableList.of(DexInvokeVirtual.class, DexReturnVoid.class));
+                DexInvokeVirtual invoke = (DexInvokeVirtual) code.instructions[0];
                 assertEquals(absSubject.getDexProgramClass().type, invoke.getMethod().holder);
 
                 code = fooFromCls1InAbsCls.getMethod().getCode().asDexCode();
-                checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class));
-                invoke = (InvokeVirtual) code.instructions[0];
+                checkInstructions(
+                    code, ImmutableList.of(DexInvokeVirtual.class, DexReturnVoid.class));
+                invoke = (DexInvokeVirtual) code.instructions[0];
                 assertEquals(absSubject.getDexProgramClass().type, invoke.getMethod().holder);
               }
             })
@@ -304,13 +306,15 @@
 
               if (parameters.isDexRuntime()) {
                 DexCode code = barInCls2.getMethod().getCode().asDexCode();
-                checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class));
-                InvokeVirtual invoke = (InvokeVirtual) code.instructions[0];
+                checkInstructions(
+                    code, ImmutableList.of(DexInvokeVirtual.class, DexReturnVoid.class));
+                DexInvokeVirtual invoke = (DexInvokeVirtual) code.instructions[0];
                 assertEquals(baseSubject.getDexProgramClass().type, invoke.getMethod().holder);
 
                 code = fooInBase.getMethod().getCode().asDexCode();
-                checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class));
-                invoke = (InvokeVirtual) code.instructions[0];
+                checkInstructions(
+                    code, ImmutableList.of(DexInvokeVirtual.class, DexReturnVoid.class));
+                invoke = (DexInvokeVirtual) code.instructions[0];
                 assertEquals(baseSubject.getDexProgramClass().type, invoke.getMethod().holder);
               }
             })
@@ -405,8 +409,9 @@
 
               if (parameters.isDexRuntime()) {
                 DexCode code = barInSub.getMethod().getCode().asDexCode();
-                checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class));
-                InvokeVirtual invoke = (InvokeVirtual) code.instructions[0];
+                checkInstructions(
+                    code, ImmutableList.of(DexInvokeVirtual.class, DexReturnVoid.class));
+                DexInvokeVirtual invoke = (DexInvokeVirtual) code.instructions[0];
                 assertEquals(baseSubject.getDexProgramClass().type, invoke.getMethod().holder);
               }
             })
@@ -491,8 +496,9 @@
 
               if (parameters.isDexRuntime()) {
                 DexCode code = barInSub.getMethod().getCode().asDexCode();
-                checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class));
-                InvokeVirtual invoke = (InvokeVirtual) code.instructions[0];
+                checkInstructions(
+                    code, ImmutableList.of(DexInvokeVirtual.class, DexReturnVoid.class));
+                DexInvokeVirtual invoke = (DexInvokeVirtual) code.instructions[0];
                 assertEquals(baseSubject.getDexProgramClass().type, invoke.getMethod().holder);
               }
             })
diff --git a/src/test/java/com/android/tools/r8/code/InstructionFactoryTest.java b/src/test/java/com/android/tools/r8/code/InstructionFactoryTest.java
index a1cfe7b..3476df7 100644
--- a/src/test/java/com/android/tools/r8/code/InstructionFactoryTest.java
+++ b/src/test/java/com/android/tools/r8/code/InstructionFactoryTest.java
@@ -5,6 +5,8 @@
 
 import static org.junit.Assert.assertTrue;
 
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInstructionFactory;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import java.nio.ByteBuffer;
 import org.junit.Test;
@@ -17,8 +19,8 @@
   @Test
   public void emptyBuffer() {
     ByteBuffer emptyBuffer = ByteBuffer.allocate(0);
-    InstructionFactory factory = new InstructionFactory();
-    Instruction[] instructions =
+    DexInstructionFactory factory = new DexInstructionFactory();
+    DexInstruction[] instructions =
         factory.readSequenceFrom(emptyBuffer.asShortBuffer(), 0, 0, new OffsetToObjectMapping());
     assertTrue(instructions.length == 0);
   }
diff --git a/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java b/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java
index 2521e02..3d3aecc 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java
@@ -6,10 +6,10 @@
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.code.ConstClass;
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.InvokeStatic;
-import com.android.tools.r8.code.ReturnVoid;
+import com.android.tools.r8.dex.code.DexConstClass;
+import com.android.tools.r8.dex.code.DexConstString;
+import com.android.tools.r8.dex.code.DexInvokeStatic;
+import com.android.tools.r8.dex.code.DexReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -52,12 +52,12 @@
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof ConstClass);
-    assertTrue(code.instructions[1] instanceof ConstString);
-    ConstString constString = (ConstString) code.instructions[1];
+    assertTrue(code.instructions[0] instanceof DexConstClass);
+    assertTrue(code.instructions[1] instanceof DexConstString);
+    DexConstString constString = (DexConstString) code.instructions[1];
     assertNotEquals("foo", constString.getString().toString());
-    assertTrue(code.instructions[2] instanceof InvokeStatic);
-    assertTrue(code.instructions[3] instanceof ReturnVoid);
+    assertTrue(code.instructions[2] instanceof DexInvokeStatic);
+    assertTrue(code.instructions[3] instanceof DexReturnVoid);
   }
 
   @Test
@@ -88,12 +88,12 @@
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof ConstClass);
-    assertTrue(code.instructions[1] instanceof ConstString);
-    ConstString constString = (ConstString) code.instructions[1];
+    assertTrue(code.instructions[0] instanceof DexConstClass);
+    assertTrue(code.instructions[1] instanceof DexConstString);
+    DexConstString constString = (DexConstString) code.instructions[1];
     assertNotEquals("foo", constString.getString().toString());
-    assertTrue(code.instructions[2] instanceof InvokeStatic);
-    assertTrue(code.instructions[3] instanceof ReturnVoid);
+    assertTrue(code.instructions[2] instanceof DexInvokeStatic);
+    assertTrue(code.instructions[3] instanceof DexReturnVoid);
   }
 
   @Test
@@ -125,12 +125,12 @@
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof ConstClass);
-    assertTrue(code.instructions[1] instanceof ConstClass);
-    assertTrue(code.instructions[2] instanceof ConstString);
-    ConstString constString = (ConstString) code.instructions[2];
+    assertTrue(code.instructions[0] instanceof DexConstClass);
+    assertTrue(code.instructions[1] instanceof DexConstClass);
+    assertTrue(code.instructions[2] instanceof DexConstString);
+    DexConstString constString = (DexConstString) code.instructions[2];
     assertNotEquals("foo", constString.getString().toString());
-    assertTrue(code.instructions[3] instanceof InvokeStatic);
-    assertTrue(code.instructions[4] instanceof ReturnVoid);
+    assertTrue(code.instructions[3] instanceof DexInvokeStatic);
+    assertTrue(code.instructions[4] instanceof DexReturnVoid);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
index b79721f..a5a9f0a1 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
@@ -7,9 +7,9 @@
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.InvokeStatic;
-import com.android.tools.r8.code.ReturnVoid;
+import com.android.tools.r8.dex.code.DexConstString;
+import com.android.tools.r8.dex.code.DexInvokeStatic;
+import com.android.tools.r8.dex.code.DexReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -52,11 +52,11 @@
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof ConstString);
-    ConstString constString = (ConstString) code.instructions[0];
+    assertTrue(code.instructions[0] instanceof DexConstString);
+    DexConstString constString = (DexConstString) code.instructions[0];
     assertNotEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[1] instanceof InvokeStatic);
-    assertTrue(code.instructions[2] instanceof ReturnVoid);
+    assertTrue(code.instructions[1] instanceof DexInvokeStatic);
+    assertTrue(code.instructions[2] instanceof DexReturnVoid);
   }
 
   @Test
@@ -88,11 +88,11 @@
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof ConstString);
-    ConstString constString = (ConstString) code.instructions[0];
+    assertTrue(code.instructions[0] instanceof DexConstString);
+    DexConstString constString = (DexConstString) code.instructions[0];
     assertEquals(BOO, constString.getString().toString());
-    assertTrue(code.instructions[1] instanceof InvokeStatic);
-    assertTrue(code.instructions[2] instanceof ReturnVoid);
+    assertTrue(code.instructions[1] instanceof DexInvokeStatic);
+    assertTrue(code.instructions[2] instanceof DexReturnVoid);
   }
 
 }
diff --git a/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java b/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java
index 5771019..7a30afd 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java
@@ -6,13 +6,13 @@
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.code.AputObject;
-import com.android.tools.r8.code.Const4;
-import com.android.tools.r8.code.ConstClass;
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.InvokeVirtual;
-import com.android.tools.r8.code.NewArray;
-import com.android.tools.r8.code.ReturnVoid;
+import com.android.tools.r8.dex.code.DexAputObject;
+import com.android.tools.r8.dex.code.DexConst4;
+import com.android.tools.r8.dex.code.DexConstClass;
+import com.android.tools.r8.dex.code.DexConstString;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
+import com.android.tools.r8.dex.code.DexNewArray;
+import com.android.tools.r8.dex.code.DexReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -53,12 +53,12 @@
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof ConstClass);
-    assertTrue(code.instructions[1] instanceof ConstString);
-    ConstString constString = (ConstString) code.instructions[1];
+    assertTrue(code.instructions[0] instanceof DexConstClass);
+    assertTrue(code.instructions[1] instanceof DexConstString);
+    DexConstString constString = (DexConstString) code.instructions[1];
     assertNotEquals("foo", constString.getString().toString());
-    assertTrue(code.instructions[2] instanceof InvokeVirtual);
-    assertTrue(code.instructions[3] instanceof ReturnVoid);
+    assertTrue(code.instructions[2] instanceof DexInvokeVirtual);
+    assertTrue(code.instructions[3] instanceof DexReturnVoid);
   }
 
   @Test
@@ -93,17 +93,17 @@
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof ConstClass);
-    assertTrue(code.instructions[1] instanceof Const4);
-    assertTrue(code.instructions[2] instanceof NewArray);
-    assertTrue(code.instructions[3] instanceof Const4);
-    assertTrue(code.instructions[4] instanceof AputObject);
-    assertTrue(code.instructions[5] instanceof ConstClass);
-    assertTrue(code.instructions[6] instanceof ConstString);
-    ConstString constString = (ConstString) code.instructions[6];
+    assertTrue(code.instructions[0] instanceof DexConstClass);
+    assertTrue(code.instructions[1] instanceof DexConst4);
+    assertTrue(code.instructions[2] instanceof DexNewArray);
+    assertTrue(code.instructions[3] instanceof DexConst4);
+    assertTrue(code.instructions[4] instanceof DexAputObject);
+    assertTrue(code.instructions[5] instanceof DexConstClass);
+    assertTrue(code.instructions[6] instanceof DexConstString);
+    DexConstString constString = (DexConstString) code.instructions[6];
     assertNotEquals("foo", constString.getString().toString());
-    assertTrue(code.instructions[7] instanceof InvokeVirtual);
-    assertTrue(code.instructions[8] instanceof ReturnVoid);
+    assertTrue(code.instructions[7] instanceof DexInvokeVirtual);
+    assertTrue(code.instructions[8] instanceof DexReturnVoid);
   }
 
 }
diff --git a/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java b/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java
index a275033..1f41abc 100644
--- a/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java
@@ -7,9 +7,9 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.code.IfEqz;
-import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.debuginfo.DebugInfoInspector;
+import com.android.tools.r8.dex.code.DexIfEqz;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.graph.DexDebugEntry;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.smali.SmaliBuilder;
@@ -111,10 +111,10 @@
             AndroidApp.builder().addProgramFiles(outs).build(),
             CLASS,
             new MethodSignature(methodName, "int", new String[] {"int"}));
-    IfEqz cond = null;
-    for (Instruction instruction : info.getMethod().getCode().asDexCode().instructions) {
-      if (instruction.getOpcode() == IfEqz.OPCODE) {
-        cond = (IfEqz) instruction;
+    DexIfEqz cond = null;
+    for (DexInstruction instruction : info.getMethod().getCode().asDexCode().instructions) {
+      if (instruction.getOpcode() == DexIfEqz.OPCODE) {
+        cond = (DexIfEqz) instruction;
         break;
       }
     }
diff --git a/src/test/java/com/android/tools/r8/debuginfo/CodeGeneratorTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/CodeGeneratorTestRunner.java
index 1f6520e..1ac5aff 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/CodeGeneratorTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/CodeGeneratorTestRunner.java
@@ -6,10 +6,10 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.code.AddInt;
-import com.android.tools.r8.code.AddInt2Addr;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.Return;
+import com.android.tools.r8.dex.code.DexAddInt;
+import com.android.tools.r8.dex.code.DexAddInt2Addr;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexReturn;
 import com.android.tools.r8.utils.AndroidApp;
 import org.junit.Test;
 
@@ -31,11 +31,11 @@
 
     DebugInfoInspector inspector = inspectMethod(d8App, clazz, "int", "intAddition", "int", "int",
         "int");
-    Instruction[] instructions = inspector.getMethod().getCode().asDexCode().instructions;
-    assertTrue(instructions[0] instanceof AddInt2Addr);
-    assertTrue(instructions[1] instanceof AddInt2Addr);
-    assertTrue(instructions[2] instanceof AddInt);
-    assertTrue(instructions[3] instanceof Return);
+    DexInstruction[] instructions = inspector.getMethod().getCode().asDexCode().instructions;
+    assertTrue(instructions[0] instanceof DexAddInt2Addr);
+    assertTrue(instructions[1] instanceof DexAddInt2Addr);
+    assertTrue(instructions[2] instanceof DexAddInt);
+    assertTrue(instructions[3] instanceof DexReturn);
   }
 
 }
diff --git a/src/test/java/com/android/tools/r8/debuginfo/Regress111337896TestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/Regress111337896TestRunner.java
index be25d4a..f144498 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/Regress111337896TestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/Regress111337896TestRunner.java
@@ -9,8 +9,8 @@
 import com.android.tools.r8.D8;
 import com.android.tools.r8.D8Command;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.Nop;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexNop;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
@@ -51,8 +51,8 @@
     info.checkStartLine(12);
     assertEquals(1, info.checkLineExists(18));
     int nopsFound = 0;
-    for (Instruction instruction : info.getMethod().getCode().asDexCode().instructions) {
-      if (instruction instanceof Nop) {
+    for (DexInstruction instruction : info.getMethod().getCode().asDexCode().instructions) {
+      if (instruction instanceof DexNop) {
         nopsFound++;
       }
     }
@@ -103,8 +103,8 @@
     info.checkStartLine(11);
     assertEquals(1, info.checkLineExists(13));
     int nopsFound = 0;
-    for (Instruction instruction : info.getMethod().getCode().asDexCode().instructions) {
-      if (instruction instanceof Nop) {
+    for (DexInstruction instruction : info.getMethod().getCode().asDexCode().instructions) {
+      if (instruction instanceof DexNop) {
         nopsFound++;
       }
     }
diff --git a/src/test/java/com/android/tools/r8/debuginfo/Regress216178582Test.java b/src/test/java/com/android/tools/r8/debuginfo/Regress216178582Test.java
index ac4be8c..92a8a3d 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/Regress216178582Test.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/Regress216178582Test.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexDebugEntry;
 import com.android.tools.r8.graph.DexDebugEntryBuilder;
@@ -68,7 +68,7 @@
                       new DexDebugEntryBuilder(method, inspector.getFactory()).build();
                   Iterator<DexDebugEntry> it = entries.iterator();
                   int pc = 0;
-                  for (Instruction instruction : code.instructions) {
+                  for (DexInstruction instruction : code.instructions) {
                     if (instruction.canThrow()) {
                       DexDebugEntry next = it.next();
                       assertEquals(
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileBackport.java b/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileBackport.java
index 2297f3f..9444833 100644
--- a/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileBackport.java
+++ b/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileBackport.java
@@ -13,8 +13,8 @@
 import com.android.tools.r8.cf.code.CfArithmeticBinop;
 import com.android.tools.r8.cf.code.CfArithmeticBinop.Opcode;
 import com.android.tools.r8.cf.code.CfInstruction;
-import com.android.tools.r8.code.AddLong2Addr;
-import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.code.DexAddLong2Addr;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.graph.CfCode;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.ir.code.NumericType;
@@ -47,8 +47,8 @@
         && (((CfArithmeticBinop) instruction).getType() == NumericType.LONG);
   }
 
-  private boolean isDexAddLong(Instruction instruction) {
-    return instruction instanceof AddLong2Addr;
+  private boolean isDexAddLong(DexInstruction instruction) {
+    return instruction instanceof DexAddLong2Addr;
   }
 
   private boolean boxedDoubleIsFiniteInvoke(InstructionSubject instruction) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java
index 64ee893..1ca61c5 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java
@@ -15,9 +15,9 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
 import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -101,7 +101,7 @@
       int numCheckCast =
           (int)
               Stream.of(method.getCode().asDexCode().instructions)
-                  .filter(Instruction::isCheckCast)
+                  .filter(DexInstruction::isCheckCast)
                   .count();
       if (method.qualifiedName().contains("spliterator")) {
         assertEquals(5, numCheckCast);
diff --git a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
index ce5a517..bf49805 100644
--- a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
+++ b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
@@ -7,16 +7,16 @@
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.code.Const4;
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.ConstStringJumbo;
-import com.android.tools.r8.code.Goto32;
-import com.android.tools.r8.code.IfEq;
-import com.android.tools.r8.code.IfEqz;
-import com.android.tools.r8.code.IfNe;
-import com.android.tools.r8.code.IfNez;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.ReturnVoid;
+import com.android.tools.r8.dex.code.DexConst4;
+import com.android.tools.r8.dex.code.DexConstString;
+import com.android.tools.r8.dex.code.DexConstStringJumbo;
+import com.android.tools.r8.dex.code.DexGoto32;
+import com.android.tools.r8.dex.code.DexIfEq;
+import com.android.tools.r8.dex.code.DexIfEqz;
+import com.android.tools.r8.dex.code.DexIfNe;
+import com.android.tools.r8.dex.code.DexIfNez;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexCode.Try;
 import com.android.tools.r8.graph.DexCode.TryHandler;
@@ -42,15 +42,15 @@
   public void branching() {
     DexItemFactory factory = new DexItemFactory();
     DexString string = factory.createString("turn into jumbo");
-    Instruction[] instructions = buildInstructions(string, false);
+    DexInstruction[] instructions = buildInstructions(string, false);
     DexCode code = jumboStringProcess(factory, string, instructions);
-    Instruction[] rewrittenInstructions = code.instructions;
-    assert rewrittenInstructions[1] instanceof IfEq;
-    IfEq condition = (IfEq) rewrittenInstructions[1];
+    DexInstruction[] rewrittenInstructions = code.instructions;
+    assert rewrittenInstructions[1] instanceof DexIfEq;
+    DexIfEq condition = (DexIfEq) rewrittenInstructions[1];
     assert condition.getOffset() + condition.CCCC == rewrittenInstructions[3].getOffset();
-    assert rewrittenInstructions[2] instanceof Goto32;
-    Goto32 jump = (Goto32) rewrittenInstructions[2];
-    Instruction lastInstruction = rewrittenInstructions[rewrittenInstructions.length - 1];
+    assert rewrittenInstructions[2] instanceof DexGoto32;
+    DexGoto32 jump = (DexGoto32) rewrittenInstructions[2];
+    DexInstruction lastInstruction = rewrittenInstructions[rewrittenInstructions.length - 1];
     assert jump.getOffset() + jump.AAAAAAAA == lastInstruction.getOffset();
   }
 
@@ -58,58 +58,58 @@
   public void branching2() {
     DexItemFactory factory = new DexItemFactory();
     DexString string = factory.createString("turn into jumbo");
-    Instruction[] instructions = buildInstructions(string, true);
+    DexInstruction[] instructions = buildInstructions(string, true);
     DexCode code = jumboStringProcess(factory, string, instructions);
-    Instruction[] rewrittenInstructions = code.instructions;
-    assert rewrittenInstructions[1] instanceof IfEqz;
-    IfEqz condition = (IfEqz) rewrittenInstructions[1];
+    DexInstruction[] rewrittenInstructions = code.instructions;
+    assert rewrittenInstructions[1] instanceof DexIfEqz;
+    DexIfEqz condition = (DexIfEqz) rewrittenInstructions[1];
     assert condition.getOffset() + condition.BBBB == rewrittenInstructions[3].getOffset();
-    assert rewrittenInstructions[2] instanceof Goto32;
-    Goto32 jump = (Goto32) rewrittenInstructions[2];
-    Instruction lastInstruction = rewrittenInstructions[rewrittenInstructions.length - 1];
+    assert rewrittenInstructions[2] instanceof DexGoto32;
+    DexGoto32 jump = (DexGoto32) rewrittenInstructions[2];
+    DexInstruction lastInstruction = rewrittenInstructions[rewrittenInstructions.length - 1];
     assert jump.getOffset() + jump.AAAAAAAA == lastInstruction.getOffset();
   }
 
-  private Instruction[] buildInstructions(DexString string, boolean zeroCondition) {
-    List<Instruction> instructions = new ArrayList<>();
+  private DexInstruction[] buildInstructions(DexString string, boolean zeroCondition) {
+    List<DexInstruction> instructions = new ArrayList<>();
     int offset = 0;
-    Instruction instr = new Const4(0, 0);
+    DexInstruction instr = new DexConst4(0, 0);
     instr.setOffset(offset);
     instructions.add(instr);
     offset += instr.getSize();
     int lastInstructionOffset = 15000 * 2 + 2 + offset;
     if (zeroCondition) {
-      instr = new IfNez(0, lastInstructionOffset - offset);
+      instr = new DexIfNez(0, lastInstructionOffset - offset);
     } else {
-      instr = new IfNe(0, 0, lastInstructionOffset - offset);
+      instr = new DexIfNe(0, 0, lastInstructionOffset - offset);
     }
     instr.setOffset(offset);
     instructions.add(instr);
     offset += instr.getSize();
     for (int i = 0; i < 15000; i++) {
-      instr = new ConstString(0, string);
+      instr = new DexConstString(0, string);
       instr.setOffset(offset);
       instructions.add(instr);
       offset += instr.getSize();
     }
-    instr = new ReturnVoid();
+    instr = new DexReturnVoid();
     instr.setOffset(offset);
     instructions.add(instr);
     assert instr.getOffset() == lastInstructionOffset;
-    return instructions.toArray(Instruction.EMPTY_ARRAY);
+    return instructions.toArray(DexInstruction.EMPTY_ARRAY);
   }
 
-  private int countJumboStrings(Instruction[] instructions) {
+  private int countJumboStrings(DexInstruction[] instructions) {
     int count = 0;
-    for (Instruction instruction : instructions) {
-      count += instruction instanceof ConstStringJumbo ? 1 : 0;
+    for (DexInstruction instruction : instructions) {
+      count += instruction instanceof DexConstStringJumbo ? 1 : 0;
     }
     return count;
   }
 
-  private int countSimpleNops(Instruction[] instructions) {
+  private int countSimpleNops(DexInstruction[] instructions) {
     int count = 0;
-    for (Instruction instruction : instructions) {
+    for (DexInstruction instruction : instructions) {
       count += instruction.isSimpleNop() ? 1 : 0;
     }
     return count;
@@ -135,20 +135,20 @@
             "getDataBinder",
             ImmutableList.of(
                 "android.databinding.DataBindingComponent", "android.view.View", "int"));
-    Instruction[] instructions = method.getDefinition().getCode().asDexCode().instructions;
+    DexInstruction[] instructions = method.getDefinition().getCode().asDexCode().instructions;
     assertEquals(0, countJumboStrings(instructions));
     assertEquals(1, countSimpleNops(instructions));
 
     DexItemFactory factory = inspector.getFactory();
     DexString string = factory.createString("view must have a tag");
     DexCode code = jumboStringProcess(factory, string, instructions);
-    Instruction[] rewrittenInstructions = code.instructions;
+    DexInstruction[] rewrittenInstructions = code.instructions;
     assertEquals(289, countJumboStrings(rewrittenInstructions));
     assertEquals(0, countSimpleNops(rewrittenInstructions));
   }
 
   private DexCode jumboStringProcess(
-      DexItemFactory factory, DexString string, Instruction[] instructions) {
+      DexItemFactory factory, DexString string, DexInstruction[] instructions) {
     DexCode code = new DexCode(1, 0, 0, instructions, new Try[0], new TryHandler[0], null);
     MethodAccessFlags flags = MethodAccessFlags.fromSharedAccessFlags(Constants.ACC_PUBLIC, false);
     DexEncodedMethod method =
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/checkcast/RemoveCheckCastAfterClassInlining.java b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/RemoveCheckCastAfterClassInlining.java
index 7a44d53..53d28eb 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/checkcast/RemoveCheckCastAfterClassInlining.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/RemoveCheckCastAfterClassInlining.java
@@ -14,7 +14,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -58,7 +58,7 @@
 
     DexCode code = method.getCode().asDexCode();
     int numberOfConstStringInstructions = 0;
-    for (Instruction instruction : code.instructions) {
+    for (DexInstruction instruction : code.instructions) {
       // Make sure that we do not load a const-string and then subsequently use a check-cast
       // instruction to check if it is actually a string.
       assertFalse(instruction.isCheckCast());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b111893131/B111893131.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b111893131/B111893131.java
index f19dea9..7ba5906 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b111893131/B111893131.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b111893131/B111893131.java
@@ -14,8 +14,8 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.InvokeVirtual;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
 import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexCode;
@@ -98,10 +98,10 @@
     });
   }
 
-  private void verifyAbsenceOfStringBuilderAppend(Instruction[] instructions) {
-    for (Instruction instr : instructions) {
-      if (instr instanceof InvokeVirtual) {
-        InvokeVirtual invokeVirtual = (InvokeVirtual) instr;
+  private void verifyAbsenceOfStringBuilderAppend(DexInstruction[] instructions) {
+    for (DexInstruction instr : instructions) {
+      if (instr instanceof DexInvokeVirtual) {
+        DexInvokeVirtual invokeVirtual = (DexInvokeVirtual) instr;
         DexMethod invokedMethod = invokeVirtual.getMethod();
         if (invokedMethod.holder.getName().endsWith("StringBuilder")) {
           assertNotEquals("append", invokedMethod.name.toString());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
index 7688f9b..9cd0f5f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
@@ -18,12 +18,12 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.InvokeDirect;
-import com.android.tools.r8.code.InvokeStatic;
-import com.android.tools.r8.code.InvokeVirtual;
-import com.android.tools.r8.code.SgetObject;
-import com.android.tools.r8.code.SputObject;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeDirect;
+import com.android.tools.r8.dex.code.DexInvokeStatic;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
+import com.android.tools.r8.dex.code.DexSgetObject;
+import com.android.tools.r8.dex.code.DexSputObject;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexType;
@@ -358,29 +358,29 @@
     MethodSignature signature = new MethodSignature(methodName, retValue, params);
     DexCode code = clazz.method(signature).getMethod().getCode().asDexCode();
     return Streams.concat(
-        filterInstructionKind(code, SgetObject.class)
-            .map(Instruction::getField)
-            .filter(fld -> isTypeOfInterest(fld.holder))
-            .map(DexField::toSourceString),
-        filterInstructionKind(code, SputObject.class)
-            .map(Instruction::getField)
-            .filter(fld -> isTypeOfInterest(fld.holder))
-            .map(DexField::toSourceString),
-        filterInstructionKind(code, InvokeStatic.class)
-            .map(insn -> (InvokeStatic) insn)
-            .map(InvokeStatic::getMethod)
-            .filter(method -> isTypeOfInterest(method.holder))
-            .map(method -> "STATIC: " + method.toSourceString()),
-        filterInstructionKind(code, InvokeVirtual.class)
-            .map(insn -> (InvokeVirtual) insn)
-            .map(InvokeVirtual::getMethod)
-            .filter(method -> isTypeOfInterest(method.holder))
-            .map(method -> "VIRTUAL: " + method.toSourceString()),
-        filterInstructionKind(code, InvokeDirect.class)
-            .map(insn -> (InvokeDirect) insn)
-            .map(InvokeDirect::getMethod)
-            .filter(method -> isTypeOfInterest(method.holder))
-            .map(method -> "DIRECT: " + method.toSourceString()))
+            filterInstructionKind(code, DexSgetObject.class)
+                .map(DexInstruction::getField)
+                .filter(fld -> isTypeOfInterest(fld.holder))
+                .map(DexField::toSourceString),
+            filterInstructionKind(code, DexSputObject.class)
+                .map(DexInstruction::getField)
+                .filter(fld -> isTypeOfInterest(fld.holder))
+                .map(DexField::toSourceString),
+            filterInstructionKind(code, DexInvokeStatic.class)
+                .map(insn -> (DexInvokeStatic) insn)
+                .map(DexInvokeStatic::getMethod)
+                .filter(method -> isTypeOfInterest(method.holder))
+                .map(method -> "STATIC: " + method.toSourceString()),
+            filterInstructionKind(code, DexInvokeVirtual.class)
+                .map(insn -> (DexInvokeVirtual) insn)
+                .map(DexInvokeVirtual::getMethod)
+                .filter(method -> isTypeOfInterest(method.holder))
+                .map(method -> "VIRTUAL: " + method.toSourceString()),
+            filterInstructionKind(code, DexInvokeDirect.class)
+                .map(insn -> (DexInvokeDirect) insn)
+                .map(DexInvokeDirect::getMethod)
+                .filter(method -> isTypeOfInterest(method.holder))
+                .map(method -> "DIRECT: " + method.toSourceString()))
         .map(txt -> txt.replace("java.lang.", ""))
         .map(txt -> txt.replace("com.android.tools.r8.ir.optimize.staticizer.trivial.", ""))
         .map(txt -> txt.replace("com.android.tools.r8.ir.optimize.staticizer.", ""))
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
index 12fe431..b7fe293 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
@@ -20,9 +20,9 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfNew;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.NewInstance;
-import com.android.tools.r8.code.SgetObject;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexNewInstance;
+import com.android.tools.r8.dex.code.DexSgetObject;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.IntBox;
@@ -293,11 +293,11 @@
                   return instruction.getField().getHolderType();
                 }
               } else {
-                Instruction baseInstruction = instruction.asDexInstruction().getInstruction();
-                if (baseInstruction instanceof SgetObject) {
+                DexInstruction baseInstruction = instruction.asDexInstruction().getInstruction();
+                if (baseInstruction instanceof DexSgetObject) {
                   return baseInstruction.getField().getHolderType();
-                } else if (baseInstruction instanceof NewInstance) {
-                  return ((NewInstance) baseInstruction).getType();
+                } else if (baseInstruction instanceof DexNewInstance) {
+                  return ((DexNewInstance) baseInstruction).getType();
                 }
               }
               return null;
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
index df6d1a5..039ba9a 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
@@ -12,18 +12,18 @@
 import com.android.tools.r8.R8FullTestBuilder;
 import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.ThrowableConsumer;
-import com.android.tools.r8.code.AputObject;
-import com.android.tools.r8.code.Const4;
-import com.android.tools.r8.code.ConstClass;
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.InvokeDirect;
-import com.android.tools.r8.code.InvokeStatic;
-import com.android.tools.r8.code.InvokeVirtual;
-import com.android.tools.r8.code.IputObject;
-import com.android.tools.r8.code.NewArray;
-import com.android.tools.r8.code.ReturnVoid;
-import com.android.tools.r8.code.SgetObject;
-import com.android.tools.r8.code.SputObject;
+import com.android.tools.r8.dex.code.DexAputObject;
+import com.android.tools.r8.dex.code.DexConst4;
+import com.android.tools.r8.dex.code.DexConstClass;
+import com.android.tools.r8.dex.code.DexConstString;
+import com.android.tools.r8.dex.code.DexInvokeDirect;
+import com.android.tools.r8.dex.code.DexInvokeStatic;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
+import com.android.tools.r8.dex.code.DexIputObject;
+import com.android.tools.r8.dex.code.DexNewArray;
+import com.android.tools.r8.dex.code.DexReturnVoid;
+import com.android.tools.r8.dex.code.DexSgetObject;
+import com.android.tools.r8.dex.code.DexSputObject;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.smali.SmaliBuilder;
@@ -67,8 +67,8 @@
     checkInstructions(
         code,
         ImmutableList.of(
-            InvokeDirect.class, ConstString.class, IputObject.class, ReturnVoid.class));
-    ConstString constString = (ConstString) code.instructions[1];
+            DexInvokeDirect.class, DexConstString.class, DexIputObject.class, DexReturnVoid.class));
+    DexConstString constString = (DexConstString) code.instructions[1];
     assertEquals(BOO, constString.getString().toString());
   }
 
@@ -100,16 +100,16 @@
     checkInstructions(
         code,
         ImmutableList.of(
-            InvokeDirect.class,
-            SgetObject.class,
-            ConstString.class,
-            InvokeVirtual.class,
-            ConstString.class,
-            IputObject.class,
-            ReturnVoid.class));
-    ConstString constString = (ConstString) code.instructions[2];
+            DexInvokeDirect.class,
+            DexSgetObject.class,
+            DexConstString.class,
+            DexInvokeVirtual.class,
+            DexConstString.class,
+            DexIputObject.class,
+            DexReturnVoid.class));
+    DexConstString constString = (DexConstString) code.instructions[2];
     assertEquals(BOO, constString.getString().toString());
-    constString = (ConstString) code.instructions[4];
+    constString = (DexConstString) code.instructions[4];
     assertEquals(BOO, constString.getString().toString());
   }
 
@@ -143,16 +143,16 @@
     checkInstructions(
         code,
         ImmutableList.of(
-            InvokeDirect.class,
-            SgetObject.class,
-            ConstString.class,
-            InvokeVirtual.class,
-            ConstString.class,
-            IputObject.class,
-            ReturnVoid.class));
-    ConstString constString = (ConstString) code.instructions[2];
+            DexInvokeDirect.class,
+            DexSgetObject.class,
+            DexConstString.class,
+            DexInvokeVirtual.class,
+            DexConstString.class,
+            DexIputObject.class,
+            DexReturnVoid.class));
+    DexConstString constString = (DexConstString) code.instructions[2];
     assertEquals(BOO, constString.getString().toString());
-    constString = (ConstString) code.instructions[4];
+    constString = (DexConstString) code.instructions[4];
     assertNotEquals(BOO, constString.getString().toString());
   }
 
@@ -180,11 +180,9 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    checkInstructions(code, ImmutableList.of(
-        ConstString.class,
-        SputObject.class,
-        ReturnVoid.class));
-    ConstString constString = (ConstString) code.instructions[0];
+    checkInstructions(
+        code, ImmutableList.of(DexConstString.class, DexSputObject.class, DexReturnVoid.class));
+    DexConstString constString = (DexConstString) code.instructions[0];
     assertEquals(BOO, constString.getString().toString());
   }
 
@@ -212,16 +210,18 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    checkInstructions(code, ImmutableList.of(
-        SgetObject.class,
-        ConstString.class,
-        InvokeVirtual.class,
-        ConstString.class,
-        SputObject.class,
-        ReturnVoid.class));
-    ConstString constString = (ConstString) code.instructions[1];
+    checkInstructions(
+        code,
+        ImmutableList.of(
+            DexSgetObject.class,
+            DexConstString.class,
+            DexInvokeVirtual.class,
+            DexConstString.class,
+            DexSputObject.class,
+            DexReturnVoid.class));
+    DexConstString constString = (DexConstString) code.instructions[1];
     assertEquals(BOO, constString.getString().toString());
-    constString = (ConstString) code.instructions[3];
+    constString = (DexConstString) code.instructions[3];
     assertEquals(BOO, constString.getString().toString());
   }
 
@@ -251,16 +251,18 @@
     assertNotNull(method);
 
     DexCode code = method.getCode().asDexCode();
-    checkInstructions(code, ImmutableList.of(
-        SgetObject.class,
-        ConstString.class,
-        InvokeVirtual.class,
-        ConstString.class,
-        SputObject.class,
-        ReturnVoid.class));
-    ConstString constString = (ConstString) code.instructions[1];
+    checkInstructions(
+        code,
+        ImmutableList.of(
+            DexSgetObject.class,
+            DexConstString.class,
+            DexInvokeVirtual.class,
+            DexConstString.class,
+            DexSputObject.class,
+            DexReturnVoid.class));
+    DexConstString constString = (DexConstString) code.instructions[1];
     assertEquals(BOO, constString.getString().toString());
-    constString = (ConstString) code.instructions[3];
+    constString = (DexConstString) code.instructions[3];
     assertNotEquals(BOO, constString.getString().toString());
   }
 
@@ -395,13 +397,13 @@
     checkInstructions(
         code,
         ImmutableList.of(
-            InvokeDirect.class,
-            ConstString.class,
-            ConstString.class,
-            InvokeStatic.class,
-            ReturnVoid.class));
-    String s1 = ((ConstString) code.instructions[1]).getString().toString();
-    String s2 = ((ConstString) code.instructions[2]).getString().toString();
+            DexInvokeDirect.class,
+            DexConstString.class,
+            DexConstString.class,
+            DexInvokeStatic.class,
+            DexReturnVoid.class));
+    String s1 = ((DexConstString) code.instructions[1]).getString().toString();
+    String s2 = ((DexConstString) code.instructions[2]).getString().toString();
     assertTrue(BOO.equals(s1) || BOO.equals(s2));
     assertTrue("Mixed/form.Boo".equals(s1) || "Mixed/form.Boo".equals(s2));
   }
@@ -439,16 +441,16 @@
     checkInstructions(
         code,
         ImmutableList.of(
-            InvokeDirect.class,
-            SgetObject.class,
-            ConstString.class,
-            InvokeVirtual.class,
-            ConstString.class,
-            InvokeStatic.class,
-            ReturnVoid.class));
-    ConstString constString = (ConstString) code.instructions[2];
+            DexInvokeDirect.class,
+            DexSgetObject.class,
+            DexConstString.class,
+            DexInvokeVirtual.class,
+            DexConstString.class,
+            DexInvokeStatic.class,
+            DexReturnVoid.class));
+    DexConstString constString = (DexConstString) code.instructions[2];
     assertEquals(BOO, constString.getString().toString());
-    constString = (ConstString) code.instructions[4];
+    constString = (DexConstString) code.instructions[4];
     assertEquals(BOO, constString.getString().toString());
   }
 
@@ -487,16 +489,16 @@
     checkInstructions(
         code,
         ImmutableList.of(
-            InvokeDirect.class,
-            SgetObject.class,
-            ConstString.class,
-            InvokeVirtual.class,
-            ConstString.class,
-            InvokeStatic.class,
-            ReturnVoid.class));
-    ConstString constString = (ConstString) code.instructions[2];
+            DexInvokeDirect.class,
+            DexSgetObject.class,
+            DexConstString.class,
+            DexInvokeVirtual.class,
+            DexConstString.class,
+            DexInvokeStatic.class,
+            DexReturnVoid.class));
+    DexConstString constString = (DexConstString) code.instructions[2];
     assertEquals(BOO, constString.getString().toString());
-    constString = (ConstString) code.instructions[4];
+    constString = (DexConstString) code.instructions[4];
     assertNotEquals(BOO, constString.getString().toString());
   }
 
@@ -541,12 +543,12 @@
     checkInstructions(
         code,
         ImmutableList.of(
-            InvokeDirect.class,
-            ConstClass.class,
-            ConstString.class,
-            InvokeStatic.class,
-            ReturnVoid.class));
-    ConstString constString = (ConstString) code.instructions[2];
+            DexInvokeDirect.class,
+            DexConstClass.class,
+            DexConstString.class,
+            DexInvokeStatic.class,
+            DexReturnVoid.class));
+    DexConstString constString = (DexConstString) code.instructions[2];
     assertEquals("foo", constString.getString().toString());
   }
 
@@ -591,12 +593,12 @@
     checkInstructions(
         code,
         ImmutableList.of(
-            InvokeDirect.class,
-            ConstClass.class,
-            ConstString.class,
-            InvokeStatic.class,
-            ReturnVoid.class));
-    ConstString constString = (ConstString) code.instructions[2];
+            DexInvokeDirect.class,
+            DexConstClass.class,
+            DexConstString.class,
+            DexInvokeStatic.class,
+            DexReturnVoid.class));
+    DexConstString constString = (DexConstString) code.instructions[2];
     assertNotEquals("foo", constString.getString().toString());
   }
 
@@ -648,16 +650,16 @@
     checkInstructions(
         code,
         ImmutableList.of(
-            InvokeDirect.class,
-            ConstClass.class,
-            Const4.class,
-            NewArray.class,
-            Const4.class,
-            AputObject.class,
-            ConstString.class,
-            InvokeStatic.class,
-            ReturnVoid.class));
-    ConstString constString = (ConstString) code.instructions[6];
+            DexInvokeDirect.class,
+            DexConstClass.class,
+            DexConst4.class,
+            DexNewArray.class,
+            DexConst4.class,
+            DexAputObject.class,
+            DexConstString.class,
+            DexInvokeStatic.class,
+            DexReturnVoid.class));
+    DexConstString constString = (DexConstString) code.instructions[6];
     assertEquals("foo", constString.getString().toString());
   }
 
@@ -709,16 +711,16 @@
     checkInstructions(
         code,
         ImmutableList.of(
-            InvokeDirect.class,
-            ConstClass.class,
-            Const4.class,
-            NewArray.class,
-            Const4.class,
-            AputObject.class,
-            ConstString.class,
-            InvokeStatic.class,
-            ReturnVoid.class));
-    ConstString constString = (ConstString) code.instructions[6];
+            DexInvokeDirect.class,
+            DexConstClass.class,
+            DexConst4.class,
+            DexNewArray.class,
+            DexConst4.class,
+            DexAputObject.class,
+            DexConstString.class,
+            DexInvokeStatic.class,
+            DexReturnVoid.class));
+    DexConstString constString = (DexConstString) code.instructions[6];
     assertNotEquals("foo", constString.getString().toString());
   }
 
diff --git a/src/test/java/com/android/tools/r8/reachabilitysensitive/ReachabilitySensitiveTest.java b/src/test/java/com/android/tools/r8/reachabilitysensitive/ReachabilitySensitiveTest.java
index c09e451..c435b84 100644
--- a/src/test/java/com/android/tools/r8/reachabilitysensitive/ReachabilitySensitiveTest.java
+++ b/src/test/java/com/android/tools/r8/reachabilitysensitive/ReachabilitySensitiveTest.java
@@ -12,10 +12,10 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.code.AddIntLit8;
-import com.android.tools.r8.code.Const4;
-import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.dex.Marker.Tool;
+import com.android.tools.r8.dex.code.DexAddIntLit8;
+import com.android.tools.r8.dex.code.DexConst4;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexDebugEvent.StartLocal;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -145,16 +145,16 @@
   private void checkAnnotatedCode(DexCode code) {
     // All live at the same time: receiver, i, j, k, System.out.
     assertEquals(5, code.registerSize);
-    Instruction first = code.instructions[0];
-    Instruction second = code.instructions[1];
-    Instruction third = code.instructions[2];
+    DexInstruction first = code.instructions[0];
+    DexInstruction second = code.instructions[1];
+    DexInstruction third = code.instructions[2];
     // None of the local declarations overwrite other locals.
-    assertTrue(first instanceof Const4);
-    assertTrue(second instanceof AddIntLit8);
-    assertTrue(third instanceof AddIntLit8);
-    int firstRegister = ((Const4) first).A;
-    int secondRegister = ((AddIntLit8) second).AA;
-    int thirdRegister = ((AddIntLit8) third).AA;
+    assertTrue(first instanceof DexConst4);
+    assertTrue(second instanceof DexAddIntLit8);
+    assertTrue(third instanceof DexAddIntLit8);
+    int firstRegister = ((DexConst4) first).A;
+    int secondRegister = ((DexAddIntLit8) second).AA;
+    int thirdRegister = ((DexAddIntLit8) third).AA;
     assertFalse(firstRegister == secondRegister);
     assertFalse(firstRegister == thirdRegister);
     assertFalse(secondRegister == thirdRegister);
diff --git a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
index 33bef6d..535da71 100644
--- a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
+++ b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
@@ -9,9 +9,9 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.code.Iget;
-import com.android.tools.r8.code.IgetObject;
-import com.android.tools.r8.code.Sget;
+import com.android.tools.r8.dex.code.DexIget;
+import com.android.tools.r8.dex.code.DexIgetObject;
+import com.android.tools.r8.dex.code.DexSget;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.utils.AndroidApp;
@@ -214,24 +214,24 @@
 
   private long countIget(DexCode code, DexField field) {
     return Arrays.stream(code.instructions)
-        .filter(instruction -> instruction instanceof Iget)
-        .map(instruction -> (Iget) instruction)
+        .filter(instruction -> instruction instanceof DexIget)
+        .map(instruction -> (DexIget) instruction)
         .filter(get -> get.getField() == field)
         .count();
   }
 
   private long countSget(DexCode code, DexField field) {
     return Arrays.stream(code.instructions)
-        .filter(instruction -> instruction instanceof Sget)
-        .map(instruction -> (Sget) instruction)
+        .filter(instruction -> instruction instanceof DexSget)
+        .map(instruction -> (DexSget) instruction)
         .filter(get -> get.getField() == field)
         .count();
   }
 
   private long countIgetObject(MethodSubject method, FieldSubject field) {
     return Arrays.stream(method.getMethod().getCode().asDexCode().instructions)
-        .filter(instruction -> instruction instanceof IgetObject)
-        .map(instruction -> (IgetObject) instruction)
+        .filter(instruction -> instruction instanceof DexIgetObject)
+        .map(instruction -> (DexIgetObject) instruction)
         .filter(get -> get.getField() == field.getField().getReference())
         .count();
   }
diff --git a/src/test/java/com/android/tools/r8/regress/b113326860/B113326860.java b/src/test/java/com/android/tools/r8/regress/b113326860/B113326860.java
index 294dbbc..b6f3d94 100644
--- a/src/test/java/com/android/tools/r8/regress/b113326860/B113326860.java
+++ b/src/test/java/com/android/tools/r8/regress/b113326860/B113326860.java
@@ -13,9 +13,9 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8Command;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.code.Sput;
-import com.android.tools.r8.code.SputBoolean;
-import com.android.tools.r8.code.SputObject;
+import com.android.tools.r8.dex.code.DexSput;
+import com.android.tools.r8.dex.code.DexSputBoolean;
+import com.android.tools.r8.dex.code.DexSputObject;
 import com.android.tools.r8.ir.code.SingleConstant;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
@@ -113,10 +113,12 @@
     assertThat(clazz, isPresent());
     MethodSubject method = clazz.method("void", "<clinit>", ImmutableList.of());
     assertThat(method, isPresent());
-    assertFalse(Arrays.stream(method.getMethod().getCode().asDexCode().instructions)
-        .anyMatch(i -> i instanceof SputBoolean || i instanceof Sput));
-    assertTrue(Arrays.stream(method.getMethod().getCode().asDexCode().instructions)
-        .anyMatch(i -> i instanceof SputObject));
+    assertFalse(
+        Arrays.stream(method.getMethod().getCode().asDexCode().instructions)
+            .anyMatch(i -> i instanceof DexSputBoolean || i instanceof DexSput));
+    assertTrue(
+        Arrays.stream(method.getMethod().getCode().asDexCode().instructions)
+            .anyMatch(i -> i instanceof DexSputObject));
   }
 
   @Test
@@ -128,8 +130,9 @@
     assertThat(clazz, isPresent());
     MethodSubject method = clazz.method("void", "<clinit>", ImmutableList.of());
     assertThat(method, isPresent());
-    assertTrue(Arrays.stream(method.getMethod().getCode().asDexCode().instructions)
-        .anyMatch(i -> i instanceof SputBoolean));
+    assertTrue(
+        Arrays.stream(method.getMethod().getCode().asDexCode().instructions)
+            .anyMatch(i -> i instanceof DexSputBoolean));
   }
 
   @Test
@@ -141,8 +144,9 @@
     assertThat(clazz, isPresent());
     MethodSubject method = clazz.method("void", "<clinit>", ImmutableList.of());
     assertThat(method, isPresent());
-    assertTrue(Arrays.stream(method.getMethod().getCode().asDexCode().instructions)
-        .anyMatch(i -> i instanceof SputBoolean));
+    assertTrue(
+        Arrays.stream(method.getMethod().getCode().asDexCode().instructions)
+            .anyMatch(i -> i instanceof DexSputBoolean));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/regress/b115552239/B115552239.java b/src/test/java/com/android/tools/r8/regress/b115552239/B115552239.java
index 5aa5d24..0703498 100644
--- a/src/test/java/com/android/tools/r8/regress/b115552239/B115552239.java
+++ b/src/test/java/com/android/tools/r8/regress/b115552239/B115552239.java
@@ -12,9 +12,9 @@
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.D8Command;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.code.CmpgFloat;
-import com.android.tools.r8.code.IfGez;
-import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.code.DexCmpgFloat;
+import com.android.tools.r8.dex.code.DexIfGez;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
@@ -58,14 +58,14 @@
       throws IOException, CompilationFailedException, ExecutionException {
     MethodSubject method = compileTestClassAndGetMethod(AndroidApiLevel.L.getLevel());
     boolean previousWasCmp = false;
-    Instruction[] instructions = method.getMethod().getCode().asDexCode().instructions;
-    assertTrue(Arrays.stream(instructions).anyMatch(i -> i instanceof CmpgFloat));
-    for (Instruction instruction : instructions) {
-      if (instruction instanceof CmpgFloat) {
+    DexInstruction[] instructions = method.getMethod().getCode().asDexCode().instructions;
+    assertTrue(Arrays.stream(instructions).anyMatch(i -> i instanceof DexCmpgFloat));
+    for (DexInstruction instruction : instructions) {
+      if (instruction instanceof DexCmpgFloat) {
         previousWasCmp = true;
         continue;
       } else if (previousWasCmp) {
-        assertTrue(instruction instanceof IfGez);
+        assertTrue(instruction instanceof DexIfGez);
       }
       previousWasCmp = false;
     }
@@ -76,15 +76,15 @@
       throws IOException, CompilationFailedException, ExecutionException {
     MethodSubject method = compileTestClassAndGetMethod(AndroidApiLevel.M.getLevel());
     boolean previousWasCmp = false;
-    Instruction[] instructions = method.getMethod().getCode().asDexCode().instructions;
-    assertTrue(Arrays.stream(instructions).anyMatch(i -> i instanceof CmpgFloat));
-    for (Instruction instruction : instructions) {
-      if (instruction instanceof CmpgFloat) {
+    DexInstruction[] instructions = method.getMethod().getCode().asDexCode().instructions;
+    assertTrue(Arrays.stream(instructions).anyMatch(i -> i instanceof DexCmpgFloat));
+    for (DexInstruction instruction : instructions) {
+      if (instruction instanceof DexCmpgFloat) {
         previousWasCmp = true;
         continue;
       } else if (previousWasCmp) {
         // We lowered the const instruction as close to its use as possible.
-        assertFalse(instruction instanceof IfGez);
+        assertFalse(instruction instanceof DexIfGez);
       }
       previousWasCmp = false;
     }
diff --git a/src/test/java/com/android/tools/r8/regress/b117907456/B117907456.java b/src/test/java/com/android/tools/r8/regress/b117907456/B117907456.java
index 4c092ce..4da22f8 100644
--- a/src/test/java/com/android/tools/r8/regress/b117907456/B117907456.java
+++ b/src/test/java/com/android/tools/r8/regress/b117907456/B117907456.java
@@ -11,12 +11,9 @@
 
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.code.Goto;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.Return;
-import com.android.tools.r8.code.ReturnVoid;
-import com.android.tools.r8.code.ReturnWide;
-import com.android.tools.r8.code.Throw;
+import com.android.tools.r8.dex.code.DexGoto;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexThrow;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -37,17 +34,17 @@
 
 public class B117907456 extends TestBase {
 
-  private boolean isGoto(Instruction lastInstruction) {
-    return lastInstruction instanceof Goto;
+  private boolean isGoto(DexInstruction lastInstruction) {
+    return lastInstruction instanceof DexGoto;
   }
 
   @Test
   public void testNopDupInsertionForDalvikTracingBug()
       throws IOException, CompilationFailedException, ExecutionException {
     MethodSubject method = getMethodSubject(AndroidApiLevel.K);
-    Instruction[] instructions = method.getMethod().getCode().asDexCode().instructions;
-    Instruction lastInstruction = instructions[instructions.length - 1];
-    assertFalse(lastInstruction instanceof Throw);
+    DexInstruction[] instructions = method.getMethod().getCode().asDexCode().instructions;
+    DexInstruction lastInstruction = instructions[instructions.length - 1];
+    assertFalse(lastInstruction instanceof DexThrow);
     assertTrue(isGoto(lastInstruction));
   }
 
@@ -55,9 +52,9 @@
   public void testNoNopDupInsertionForDalvikTracingBug()
       throws IOException, CompilationFailedException, ExecutionException {
     MethodSubject method = getMethodSubject(AndroidApiLevel.L);
-    Instruction[] instructions = method.getMethod().getCode().asDexCode().instructions;
-    Instruction lastInstruction = instructions[instructions.length - 1];
-    assertTrue(lastInstruction instanceof Throw);
+    DexInstruction[] instructions = method.getMethod().getCode().asDexCode().instructions;
+    DexInstruction lastInstruction = instructions[instructions.length - 1];
+    assertTrue(lastInstruction instanceof DexThrow);
   }
 
   private MethodSubject getMethodSubject(AndroidApiLevel level)
diff --git a/src/test/java/com/android/tools/r8/regress/b142682636/Regress142682636Runner.java b/src/test/java/com/android/tools/r8/regress/b142682636/Regress142682636Runner.java
index d3604b6..78694ea 100644
--- a/src/test/java/com/android/tools/r8/regress/b142682636/Regress142682636Runner.java
+++ b/src/test/java/com/android/tools/r8/regress/b142682636/Regress142682636Runner.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.code.MoveWide;
+import com.android.tools.r8.dex.code.DexMoveWide;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
@@ -54,8 +54,9 @@
   }
 
   private void checkNoMoveWide(MethodSubject m) {
-    assertTrue(Arrays.stream(m.getMethod().getCode().asDexCode().instructions)
-        .noneMatch(i -> i instanceof MoveWide));
+    assertTrue(
+        Arrays.stream(m.getMethod().getCode().asDexCode().instructions)
+            .noneMatch(i -> i instanceof DexMoveWide));
   }
 
 }
diff --git a/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java b/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
index 7fb7e88..375b845 100644
--- a/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
+++ b/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
@@ -7,8 +7,8 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.code.InvokeStatic;
 import com.android.tools.r8.dex.Marker.Tool;
+import com.android.tools.r8.dex.code.DexInvokeStatic;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
@@ -419,8 +419,8 @@
         factory.booleanDescriptor,
         new DexString[]{factory.doubleDescriptor});
     for (int i = 0; i < code.instructions.length; i++) {
-      if (code.instructions[i] instanceof InvokeStatic) {
-        InvokeStatic invoke = (InvokeStatic) code.instructions[i];
+      if (code.instructions[i] instanceof DexInvokeStatic) {
+        DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[i];
         if (invoke.getMethod() == doubleIsNaN) {
           count++;
         }
diff --git a/src/test/java/com/android/tools/r8/regress/b80262475/B80262475.java b/src/test/java/com/android/tools/r8/regress/b80262475/B80262475.java
index b3fc08f..1d70128 100644
--- a/src/test/java/com/android/tools/r8/regress/b80262475/B80262475.java
+++ b/src/test/java/com/android/tools/r8/regress/b80262475/B80262475.java
@@ -5,18 +5,13 @@
 package com.android.tools.r8.regress.b80262475;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static junit.framework.TestCase.assertTrue;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertFalse;
 
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.LongToInt;
-import com.android.tools.r8.code.Return;
-import com.android.tools.r8.code.ReturnVoid;
-import com.android.tools.r8.code.ReturnWide;
-import com.android.tools.r8.code.Throw;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexLongToInt;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -35,9 +30,9 @@
 
 public class B80262475 extends TestBase {
 
-  private boolean overlappingLongToIntInputAndOutput(Instruction instruction) {
-    if (instruction instanceof LongToInt) {
-      LongToInt longToInt = (LongToInt) instruction;
+  private boolean overlappingLongToIntInputAndOutput(DexInstruction instruction) {
+    if (instruction instanceof DexLongToInt) {
+      DexLongToInt longToInt = (DexLongToInt) instruction;
       return longToInt.A == longToInt.B;
     }
     return false;
@@ -47,8 +42,8 @@
   public void testLongToIntOverlap()
       throws IOException, CompilationFailedException, ExecutionException {
     MethodSubject method = getMethodSubject(AndroidApiLevel.L);
-    Instruction[] instructions = method.getMethod().getCode().asDexCode().instructions;
-    for (Instruction instruction : instructions) {
+    DexInstruction[] instructions = method.getMethod().getCode().asDexCode().instructions;
+    for (DexInstruction instruction : instructions) {
       assertFalse(overlappingLongToIntInputAndOutput(instruction));
     }
   }
diff --git a/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java b/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
index 662b22e..eb4bb23 100644
--- a/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
@@ -9,8 +9,8 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.code.IfEqz;
-import com.android.tools.r8.code.SgetBoolean;
+import com.android.tools.r8.dex.code.DexIfEqz;
+import com.android.tools.r8.dex.code.DexSgetBoolean;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexValue;
 import com.android.tools.r8.smali.SmaliBuilder;
@@ -393,8 +393,8 @@
     assertEquals(("5"), value.asDexValueString().getValue().toString());
 
     DexCode code = inspector.clazz("Test").clinit().getMethod().getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof SgetBoolean);
-    assertTrue(code.instructions[1] instanceof IfEqz);
+    assertTrue(code.instructions[0] instanceof DexSgetBoolean);
+    assertTrue(code.instructions[1] instanceof DexIfEqz);
 
     String result = runArt(processedApplication);
 
diff --git a/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingTest.java b/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingTest.java
index bcd4063..03275f0 100644
--- a/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingTest.java
@@ -8,14 +8,14 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.code.Const;
-import com.android.tools.r8.code.Const4;
-import com.android.tools.r8.code.ConstHigh16;
-import com.android.tools.r8.code.IfEq;
-import com.android.tools.r8.code.IfEqz;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.PackedSwitch;
-import com.android.tools.r8.code.SparseSwitch;
+import com.android.tools.r8.dex.code.DexConst;
+import com.android.tools.r8.dex.code.DexConst4;
+import com.android.tools.r8.dex.code.DexConstHigh16;
+import com.android.tools.r8.dex.code.DexIfEq;
+import com.android.tools.r8.dex.code.DexIfEqz;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexPackedSwitch;
+import com.android.tools.r8.dex.code.DexSparseSwitch;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.smali.SmaliBuilder;
@@ -30,10 +30,10 @@
 
 public class SwitchRewritingTest extends SmaliTestBase {
 
-  private boolean some16BitConst(Instruction instruction) {
-    return instruction instanceof Const4
-        || instruction instanceof ConstHigh16
-        || instruction instanceof Const;
+  private boolean some16BitConst(DexInstruction instruction) {
+    return instruction instanceof DexConst4
+        || instruction instanceof DexConstHigh16
+        || instruction instanceof DexConst;
   }
 
   private void runSingleCaseDexTest(boolean packed, int key) throws CompilationFailedException {
@@ -88,11 +88,11 @@
 
     if (key == 0) {
       assertEquals(5, code.instructions.length);
-      assertTrue(code.instructions[0] instanceof IfEqz);
+      assertTrue(code.instructions[0] instanceof DexIfEqz);
     } else {
       assertEquals(6, code.instructions.length);
       assertTrue(some16BitConst(code.instructions[0]));
-      assertTrue(code.instructions[1] instanceof IfEq);
+      assertTrue(code.instructions[1] instanceof DexIfEq);
     }
   }
 
@@ -158,13 +158,13 @@
     DexEncodedMethod method = getMethod(processedApplication, signature);
     DexCode code = method.getCode().asDexCode();
     if (keyStep <= 2) {
-      assertTrue(code.instructions[0] instanceof PackedSwitch);
+      assertTrue(code.instructions[0] instanceof DexPackedSwitch);
     } else {
       if (additionalLastKey != null && additionalLastKey == Integer.MAX_VALUE) {
-        assertTrue(code.instructions[0] instanceof Const);
-        assertTrue(code.instructions[1] instanceof IfEq);
+        assertTrue(code.instructions[0] instanceof DexConst);
+        assertTrue(code.instructions[1] instanceof DexIfEq);
       } else {
-        assertTrue(code.instructions[0] instanceof SparseSwitch);
+        assertTrue(code.instructions[0] instanceof DexSparseSwitch);
       }
     }
   }
diff --git a/src/test/java/com/android/tools/r8/smali/BinopLiteralTest.java b/src/test/java/com/android/tools/r8/smali/BinopLiteralTest.java
index 7429b43..afd71b9 100644
--- a/src/test/java/com/android/tools/r8/smali/BinopLiteralTest.java
+++ b/src/test/java/com/android/tools/r8/smali/BinopLiteralTest.java
@@ -7,11 +7,11 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.code.Const16;
-import com.android.tools.r8.code.Format22b;
-import com.android.tools.r8.code.Format22s;
-import com.android.tools.r8.code.Return;
 import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.dex.code.DexConst16;
+import com.android.tools.r8.dex.code.DexFormat22b;
+import com.android.tools.r8.dex.code.DexFormat22s;
+import com.android.tools.r8.dex.code.DexReturn;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import java.util.Arrays;
@@ -63,9 +63,9 @@
         );
         DexCode code = method.getCode().asDexCode();
         assertEquals(2, code.instructions.length);
-        assertTrue(code.instructions[0] instanceof Format22b);
-        assertEquals(lit8Value, ((Format22b) code.instructions[0]).CC);
-        assertTrue(code.instructions[1] instanceof Return);
+        assertTrue(code.instructions[0] instanceof DexFormat22b);
+        assertEquals(lit8Value, ((DexFormat22b) code.instructions[0]).CC);
+        assertTrue(code.instructions[1] instanceof DexReturn);
       }
     }
   }
@@ -88,9 +88,9 @@
         );
         DexCode code = method.getCode().asDexCode();
         assertEquals(2, code.instructions.length);
-        assertTrue(code.instructions[0] instanceof Format22s);
-        assertEquals(lit16Value, ((Format22s) code.instructions[0]).CCCC);
-        assertTrue(code.instructions[1] instanceof Return);
+        assertTrue(code.instructions[0] instanceof DexFormat22s);
+        assertEquals(lit16Value, ((DexFormat22s) code.instructions[0]).CCCC);
+        assertTrue(code.instructions[1] instanceof DexReturn);
       }
     }
   }
@@ -111,9 +111,9 @@
         );
         DexCode code = method.getCode().asDexCode();
         assertEquals(3, code.instructions.length);
-        assertTrue(code.instructions[0] instanceof Const16);
-        assertEquals(lit16Value, ((Const16) code.instructions[0]).BBBB);
-        assertTrue(code.instructions[2] instanceof Return);
+        assertTrue(code.instructions[0] instanceof DexConst16);
+        assertEquals(lit16Value, ((DexConst16) code.instructions[0]).BBBB);
+        assertTrue(code.instructions[2] instanceof DexReturn);
       }
     }
   }
diff --git a/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java b/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
index b9a9dc8..54fe690 100644
--- a/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
+++ b/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
@@ -6,12 +6,12 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.code.Const4;
-import com.android.tools.r8.code.DivIntLit8;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.RemIntLit8;
-import com.android.tools.r8.code.Return;
-import com.android.tools.r8.code.ReturnWide;
+import com.android.tools.r8.dex.code.DexConst4;
+import com.android.tools.r8.dex.code.DexDivIntLit8;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexRemIntLit8;
+import com.android.tools.r8.dex.code.DexReturn;
+import com.android.tools.r8.dex.code.DexReturnWide;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
@@ -135,13 +135,13 @@
       assertTrue(code.instructions[0] instanceof WideConstant);
       assertEquals(test.result.longValue(),
           ((WideConstant) code.instructions[0]).decodedValue());
-      assertTrue(code.instructions[1] instanceof ReturnWide);
+      assertTrue(code.instructions[1] instanceof DexReturnWide);
     } else {
       assertTrue(code.instructions[0] instanceof SingleConstant);
       assertEquals(
           test.result.longValue(),
           (long) ((SingleConstant) code.instructions[0]).decodedValue());
-      assertTrue(code.instructions[1] instanceof Return);
+      assertTrue(code.instructions[1] instanceof DexReturn);
     }
   }
 
@@ -211,50 +211,50 @@
     testBuilder.addTest(
         (builder, name, parameters) -> {
           builder.addStaticMethod(
-              "int", name, Collections.singletonList("int"),
+              "int",
+              name,
+              Collections.singletonList("int"),
               2,
               "    const/4 v0, 1           ",
               "    const/4 v1, 0           ",
               "    div-int/2addr v0, v1    ",
-              "    return v0\n             "
-          );
+              "    return v0\n             ");
         },
         (method, parameters) -> {
           DexCode code = method.getCode().asDexCode();
           // Division by zero is not folded, but div-int/lit8 is used.
           assertEquals(3, code.instructions.length);
-          assertTrue(code.instructions[0] instanceof Const4);
-          assertTrue(code.instructions[1] instanceof DivIntLit8);
-          assertEquals(0, ((DivIntLit8) code.instructions[1]).CC);
-          assertTrue(code.instructions[2] instanceof Return);
+          assertTrue(code.instructions[0] instanceof DexConst4);
+          assertTrue(code.instructions[1] instanceof DexDivIntLit8);
+          assertEquals(0, ((DexDivIntLit8) code.instructions[1]).CC);
+          assertTrue(code.instructions[2] instanceof DexReturn);
         },
-        null
-    );
+        null);
   }
 
   private void addDivIntFoldRemByZero(SmaliBuilderWithCheckers testBuilder) {
     testBuilder.addTest(
         (builder, name, parameters) -> {
           builder.addStaticMethod(
-            "int", name, Collections.singletonList("int"),
-            2,
-            "    const/4 v0, 1           ",
-            "    const/4 v1, 0           ",
-            "    rem-int/2addr v0, v1    ",
-            "    return v0\n             "
-          );
+              "int",
+              name,
+              Collections.singletonList("int"),
+              2,
+              "    const/4 v0, 1           ",
+              "    const/4 v1, 0           ",
+              "    rem-int/2addr v0, v1    ",
+              "    return v0\n             ");
         },
         (method, parameters) -> {
           DexCode code = method.getCode().asDexCode();
           // Division by zero is not folded, but rem-int/lit8 is used.
           assertEquals(3, code.instructions.length);
-          assertTrue(code.instructions[0] instanceof Const4);
-          assertTrue(code.instructions[1] instanceof RemIntLit8);
-          assertEquals(0, ((RemIntLit8) code.instructions[1]).CC);
-          assertTrue(code.instructions[2] instanceof Return);
+          assertTrue(code.instructions[0] instanceof DexConst4);
+          assertTrue(code.instructions[1] instanceof DexRemIntLit8);
+          assertEquals(0, ((DexRemIntLit8) code.instructions[1]).CC);
+          assertTrue(code.instructions[2] instanceof DexReturn);
         },
-        null
-    );
+        null);
   }
 
   public class UnopTestData {
@@ -302,12 +302,12 @@
     if (wide) {
       assertTrue(code.instructions[0] instanceof WideConstant);
       assertEquals(test.result.longValue(), ((WideConstant) code.instructions[0]).decodedValue());
-      assertTrue(code.instructions[1] instanceof ReturnWide);
+      assertTrue(code.instructions[1] instanceof DexReturnWide);
     } else {
       assertTrue(code.instructions[0] instanceof SingleConstant);
       assertEquals(
           test.result.longValue(), (long) ((SingleConstant) code.instructions[0]).decodedValue());
-      assertTrue(code.instructions[1] instanceof Return);
+      assertTrue(code.instructions[1] instanceof DexReturn);
     }
   }
 
@@ -330,12 +330,12 @@
     addUnopTest(testBuilder, new UnopTestData("double", "neg", doubleBits(-0.0), doubleBits(0.0)));
   }
 
-  private void assertConstValue(int expected, Instruction insn) {
+  private void assertConstValue(int expected, DexInstruction insn) {
     assertTrue(insn instanceof SingleConstant);
     assertEquals(expected, ((SingleConstant) insn).decodedValue());
   }
 
-  private void assertConstValue(long expected, Instruction insn) {
+  private void assertConstValue(long expected, DexInstruction insn) {
     assertTrue(insn instanceof WideConstant);
     assertEquals(expected, ((WideConstant) insn).decodedValue());
   }
@@ -393,7 +393,7 @@
     // Test that this just returns a constant.
     assertEquals(2, code.instructions.length);
     assertConstValue(test.expected, code.instructions[0]);
-    assertTrue(code.instructions[1] instanceof Return);
+    assertTrue(code.instructions[1] instanceof DexReturn);
   }
 
   private void addLogicalOperatorsFoldTests(SmaliBuilderWithCheckers testBuilder) {
@@ -476,7 +476,7 @@
     // Test that this just returns a constant.
     assertEquals(2, code.instructions.length);
     assertConstValue(data.expected, code.instructions[0]);
-    assertTrue(code.instructions[1] instanceof Return);
+    assertTrue(code.instructions[1] instanceof DexReturn);
   }
 
   public void addShiftOperatorsFolding(SmaliBuilderWithCheckers testBuilder) {
@@ -560,7 +560,7 @@
     // Test that this just returns a constant.
     assertEquals(2, code.instructions.length);
     assertConstValue(data.expected, code.instructions[0]);
-    assertTrue(code.instructions[1] instanceof ReturnWide);
+    assertTrue(code.instructions[1] instanceof DexReturnWide);
   }
 
   public void addShiftOperatorsFoldingWide(SmaliBuilderWithCheckers testBuilder) {
@@ -598,7 +598,7 @@
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
     assertConstValue(~value, code.instructions[0]);
-    assertTrue(code.instructions[1] instanceof Return);
+    assertTrue(code.instructions[1] instanceof DexReturn);
   }
 
   private void addNotIntFoldTests(SmaliBuilderWithCheckers testBuilder) throws Exception {
@@ -620,7 +620,7 @@
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
     assertConstValue(~value, code.instructions[0]);
-    assertTrue(code.instructions[1] instanceof ReturnWide);
+    assertTrue(code.instructions[1] instanceof DexReturnWide);
   }
 
 
@@ -650,7 +650,7 @@
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
     assertConstValue(-value, code.instructions[0]);
-    assertTrue(code.instructions[1] instanceof Return);
+    assertTrue(code.instructions[1] instanceof DexReturn);
   }
 
   private void addNegIntFoldTests(SmaliBuilderWithCheckers testBuilder) throws Exception {
@@ -673,7 +673,7 @@
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
     assertConstValue(-value, code.instructions[0]);
-    assertTrue(code.instructions[1] instanceof ReturnWide);
+    assertTrue(code.instructions[1] instanceof DexReturnWide);
   }
 
   private void addNegLongFoldTests(SmaliBuilderWithCheckers testBuilder) throws Exception {
@@ -748,7 +748,7 @@
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
     assertConstValue(test.expected ? 1: 0, code.instructions[0]);
-    assertTrue(code.instructions[1] instanceof Return);
+    assertTrue(code.instructions[1] instanceof DexReturn);
   }
 
   private void addCmpFloatFoldTests(SmaliBuilderWithCheckers testBuilder) throws Exception {
@@ -856,7 +856,7 @@
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
     assertConstValue(test.expected ? 1: 0, code.instructions[0]);
-    assertTrue(code.instructions[1] instanceof Return);
+    assertTrue(code.instructions[1] instanceof DexReturn);
   }
 
 
@@ -920,7 +920,7 @@
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
     assertConstValue(Long.compare(values[0], values[1]), code.instructions[0]);
-    assertTrue(code.instructions[1] instanceof Return);
+    assertTrue(code.instructions[1] instanceof DexReturn);
   }
 
   private void addCmpLongFold(SmaliBuilderWithCheckers testBuilder) throws Exception {
diff --git a/src/test/java/com/android/tools/r8/smali/IfSimplificationTest.java b/src/test/java/com/android/tools/r8/smali/IfSimplificationTest.java
index d42de0f..35dee6e 100644
--- a/src/test/java/com/android/tools/r8/smali/IfSimplificationTest.java
+++ b/src/test/java/com/android/tools/r8/smali/IfSimplificationTest.java
@@ -7,16 +7,16 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.code.Const4;
-import com.android.tools.r8.code.IfEqz;
-import com.android.tools.r8.code.IfGez;
-import com.android.tools.r8.code.IfGtz;
-import com.android.tools.r8.code.IfLez;
-import com.android.tools.r8.code.IfLtz;
-import com.android.tools.r8.code.IfNez;
-import com.android.tools.r8.code.InvokeVirtual;
-import com.android.tools.r8.code.Return;
-import com.android.tools.r8.code.ReturnObject;
+import com.android.tools.r8.dex.code.DexConst4;
+import com.android.tools.r8.dex.code.DexIfEqz;
+import com.android.tools.r8.dex.code.DexIfGez;
+import com.android.tools.r8.dex.code.DexIfGtz;
+import com.android.tools.r8.dex.code.DexIfLez;
+import com.android.tools.r8.dex.code.DexIfLtz;
+import com.android.tools.r8.dex.code.DexIfNez;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
+import com.android.tools.r8.dex.code.DexReturn;
+import com.android.tools.r8.dex.code.DexReturnObject;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.ir.code.If.Type;
@@ -55,9 +55,9 @@
         "  goto :label_1");
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
-    assertTrue(code.instructions[0] instanceof Const4);
-    assertEquals(0, ((Const4) code.instructions[0]).B);
-    assertTrue(code.instructions[1] instanceof Return);
+    assertTrue(code.instructions[0] instanceof DexConst4);
+    assertEquals(0, ((DexConst4) code.instructions[0]).B);
+    assertTrue(code.instructions[1] instanceof DexReturn);
   }
 
   @Test
@@ -75,9 +75,9 @@
         "  goto :label_1");
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
-    assertTrue(code.instructions[0] instanceof Const4);
-    assertEquals(2, ((Const4) code.instructions[0]).B);
-    assertTrue(code.instructions[1] instanceof Return);
+    assertTrue(code.instructions[0] instanceof DexConst4);
+    assertEquals(2, ((DexConst4) code.instructions[0]).B);
+    assertTrue(code.instructions[1] instanceof DexReturn);
   }
 
   @Test
@@ -99,9 +99,9 @@
         "  goto :label_1");
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
-    assertTrue(code.instructions[0] instanceof Const4);
-    assertEquals(0, ((Const4) code.instructions[0]).B);
-    assertTrue(code.instructions[1] instanceof Return);
+    assertTrue(code.instructions[0] instanceof DexConst4);
+    assertEquals(0, ((DexConst4) code.instructions[0]).B);
+    assertTrue(code.instructions[1] instanceof DexReturn);
   }
 
   @Test
@@ -123,9 +123,9 @@
         "  goto :label_2");
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
-    assertTrue(code.instructions[0] instanceof Const4);
-    assertEquals(0, ((Const4) code.instructions[0]).B);
-    assertTrue(code.instructions[1] instanceof Return);
+    assertTrue(code.instructions[0] instanceof DexConst4);
+    assertEquals(0, ((DexConst4) code.instructions[0]).B);
+    assertTrue(code.instructions[1] instanceof DexReturn);
   }
 
   @Test
@@ -154,9 +154,9 @@
         "  goto :label_2");
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
-    assertTrue(code.instructions[0] instanceof Const4);
-    assertEquals(0, ((Const4) code.instructions[0]).B);
-    assertTrue(code.instructions[1] instanceof Return);
+    assertTrue(code.instructions[0] instanceof DexConst4);
+    assertEquals(0, ((DexConst4) code.instructions[0]).B);
+    assertTrue(code.instructions[1] instanceof DexReturn);
   }
 
   @Test
@@ -181,7 +181,7 @@
         "  return v0");
     DexCode code = method.getCode().asDexCode();
     assertEquals(10, code.instructions.length);
-    assertTrue(code.instructions[9] instanceof Return);
+    assertTrue(code.instructions[9] instanceof DexReturn);
   }
 
   @Test
@@ -199,9 +199,9 @@
         "  goto :label_2");
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
-    assertTrue(code.instructions[0] instanceof Const4);
-    assertEquals(0, ((Const4) code.instructions[0]).B);
-    assertTrue(code.instructions[1] instanceof Return);
+    assertTrue(code.instructions[0] instanceof DexConst4);
+    assertEquals(0, ((DexConst4) code.instructions[0]).B);
+    assertTrue(code.instructions[1] instanceof DexReturn);
   }
 
   @Test
@@ -257,10 +257,10 @@
             "  goto :label_1");
         DexCode code = method.getCode().asDexCode();
         assertEquals(2, code.instructions.length);
-        assertTrue(code.instructions[0] instanceof Const4);
+        assertTrue(code.instructions[0] instanceof DexConst4);
         int expected = test.results[type.ordinal()] ? 1 : 0;
-        assertEquals(expected, ((Const4) code.instructions[0]).B);
-        assertTrue(code.instructions[1] instanceof Return);
+        assertEquals(expected, ((DexConst4) code.instructions[0]).B);
+        assertTrue(code.instructions[1] instanceof DexReturn);
       }
     }
   }
@@ -288,113 +288,121 @@
     DexCode code = method.getCode().asDexCode();
     assertEquals(5, code.instructions.length);
     assertTrue(expected.isInstance(code.instructions[0]));
-    assertTrue(code.instructions[4] instanceof Return);
+    assertTrue(code.instructions[4] instanceof DexReturn);
   }
 
   @Test
   public void testRewriteIfWithConstZero() {
-    runRewriteIfWithConstZeroTest(Type.EQ, true, IfEqz.class);
-    runRewriteIfWithConstZeroTest(Type.NE, true, IfNez.class);
-    runRewriteIfWithConstZeroTest(Type.LE, true, IfGez.class);
-    runRewriteIfWithConstZeroTest(Type.GE, true, IfLez.class);
-    runRewriteIfWithConstZeroTest(Type.LT, true, IfGtz.class);
-    runRewriteIfWithConstZeroTest(Type.GT, true, IfLtz.class);
+    runRewriteIfWithConstZeroTest(Type.EQ, true, DexIfEqz.class);
+    runRewriteIfWithConstZeroTest(Type.NE, true, DexIfNez.class);
+    runRewriteIfWithConstZeroTest(Type.LE, true, DexIfGez.class);
+    runRewriteIfWithConstZeroTest(Type.GE, true, DexIfLez.class);
+    runRewriteIfWithConstZeroTest(Type.LT, true, DexIfGtz.class);
+    runRewriteIfWithConstZeroTest(Type.GT, true, DexIfLtz.class);
 
-    runRewriteIfWithConstZeroTest(Type.EQ, false, IfEqz.class);
-    runRewriteIfWithConstZeroTest(Type.NE, false, IfNez.class);
-    runRewriteIfWithConstZeroTest(Type.LE, false, IfLez.class);
-    runRewriteIfWithConstZeroTest(Type.GE, false, IfGez.class);
-    runRewriteIfWithConstZeroTest(Type.LT, false, IfLtz.class);
-    runRewriteIfWithConstZeroTest(Type.GT, false, IfGtz.class);
+    runRewriteIfWithConstZeroTest(Type.EQ, false, DexIfEqz.class);
+    runRewriteIfWithConstZeroTest(Type.NE, false, DexIfNez.class);
+    runRewriteIfWithConstZeroTest(Type.LE, false, DexIfLez.class);
+    runRewriteIfWithConstZeroTest(Type.GE, false, DexIfGez.class);
+    runRewriteIfWithConstZeroTest(Type.LT, false, DexIfLtz.class);
+    runRewriteIfWithConstZeroTest(Type.GT, false, DexIfGtz.class);
   }
 
   @Test
   public void x() {
-    DexEncodedMethod method = oneMethodApplication(
-        "Test",
-        Lists.newArrayList("Test", "java.lang.String[]", "java.lang.String",
-            "java.lang.String[]", "java.lang.String"),
-        10,
-        "          const/4             v4, 0x00  # 0",
-        "          invoke-virtual      { v10 }, LTest;->a()LTest;",
-        "          if-nez              v4, :label_8",
-        "          move-object         v0, v4",
-        "      :label_7",
-        "          return-object       v0",
-        "      :label_8",
-        "          invoke-static       { v14 }, LTest;->a([Ljava/lang/String;)LTest;",
-        "          move-result-object  v2",
-        "          invoke-virtual      { v2 }, LTest;->a()Z",
-        "          move-result         v0",
-        "          if-nez              v0, :label_20",
-        "          move-object         v0, v4",
-        "          goto                :label_7",
-        "      :label_20",
-        "          iget-wide           v0, v2, LTest;->a:J",
-        "          iget-wide           v6, v2, LTest;->b:J",
-        "          invoke-virtual      { v2 }, LTest;->c()Z",
-        "          move-result         v2",
-        "          if-eqz              v2, :label_33",
-        "          invoke-virtual      { v4 }, LTest;->a()V",
-        "      :label_33",
-        "          new-instance        v5, LTest;",
-        "          sget-object         v2, LTest;->a:[Ljava/lang/String;",
-        "          invoke-direct       { v5, v2 }, LTest;-><init>([Ljava/lang/String;)V",
-        "          invoke-virtual      { v10 }, LTest;->a()LTest;",
-        "          invoke-virtual      { v4, v0, v1, v6, v7 }, LTest;->a(JJ)Ljava/util/List;",
-        "          move-result-object  v2",
-        "          invoke-interface    { v2 }, Ljava/util/List;->iterator()Ljava/util/Iterator;",
-        "          move-result-object  v6",
-        "          move-wide           v2, v0",
-        "      :label_52",
-        "          invoke-interface    { v6 }, Ljava/util/Iterator;->hasNext()Z",
-        "          move-result         v0",
-        "          if-eqz              v0, :label_107",
-        "          invoke-interface    { v6 }, Ljava/util/Iterator;->next()Ljava/lang/Object;",
-        "          move-result-object  v0",
-        "          check-cast          v0, LTest;",
-        "          const-wide/16       v8, 0x0000000000000001  # 1",
-        "          add-long/2addr      v2, v8",
-        "          invoke-virtual      { v5 }, LTest;->newRow()LTest;",
-        "          move-result-object  v1",
-        "          invoke-static       { v2, v3 }, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;",
-        "          move-result-object  v7",
-        "          invoke-virtual      { v1, v7 }, LTest;->a(Ljava/lang/Object;)LTest;",
-        "          move-result-object  v1",
-        "          const-string        v7, \"add\"",
-        "          invoke-virtual      { v1, v7 }, LTest;->a(Ljava/lang/Object;)LTest;",
-        "          move-result-object  v1",
-        "          iget-object         v7, v0, LTest;->a:Ljava/lang/String;",
-        "          invoke-virtual      { v1, v7 }, LTest;->a(Ljava/lang/Object;)LTest;",
-        "          move-result-object  v1",
-        "          iget                v7, v0, LTest;->b:I",
-        "          invoke-static       { v7 }, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;",
-        "          move-result-object  v7",
-        "          invoke-virtual      { v1, v7 }, LTest;->add(Ljava/lang/Object;)LTest;",
-        "          move-result-object  v1",
-        "          iget-object         v0, v0, LTest;->a:Ljava/lang/String;",
-        "          invoke-virtual      { v1, v0 }, LTest;->add(Ljava/lang/Object;)LTest;",
-        "          goto                :label_52",
-        "      :label_107",
-        "          iget-object         v0, v4, LTest;->a:LTest;",
-        "          const-string        v1, \"text 1\"",
-        "          const/4             v2, 0x00  # 0",
-        "          invoke-virtual      { v0, v1, v2 }, LTest;->a(Ljava/lang/String;I)LTest;",
-        "          move-result-object  v0",
-        "          const-string        v1, \"text 2\"",
-        "          const-string        v2, \"\"",
-        "          invoke-interface    { v0, v1, v2 }, LTest;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
-        "          move-result-object  v0",
-        "          invoke-static       { v5, v0 }, LTest;->a(LTest;Ljava/lang/String;)LTest;",
-        "          move-result-object  v0",
-        "          goto                :label_7"
-    );
+    DexEncodedMethod method =
+        oneMethodApplication(
+            "Test",
+            Lists.newArrayList(
+                "Test",
+                "java.lang.String[]",
+                "java.lang.String",
+                "java.lang.String[]",
+                "java.lang.String"),
+            10,
+            "          const/4             v4, 0x00  # 0",
+            "          invoke-virtual      { v10 }, LTest;->a()LTest;",
+            "          if-nez              v4, :label_8",
+            "          move-object         v0, v4",
+            "      :label_7",
+            "          return-object       v0",
+            "      :label_8",
+            "          invoke-static       { v14 }, LTest;->a([Ljava/lang/String;)LTest;",
+            "          move-result-object  v2",
+            "          invoke-virtual      { v2 }, LTest;->a()Z",
+            "          move-result         v0",
+            "          if-nez              v0, :label_20",
+            "          move-object         v0, v4",
+            "          goto                :label_7",
+            "      :label_20",
+            "          iget-wide           v0, v2, LTest;->a:J",
+            "          iget-wide           v6, v2, LTest;->b:J",
+            "          invoke-virtual      { v2 }, LTest;->c()Z",
+            "          move-result         v2",
+            "          if-eqz              v2, :label_33",
+            "          invoke-virtual      { v4 }, LTest;->a()V",
+            "      :label_33",
+            "          new-instance        v5, LTest;",
+            "          sget-object         v2, LTest;->a:[Ljava/lang/String;",
+            "          invoke-direct       { v5, v2 }, LTest;-><init>([Ljava/lang/String;)V",
+            "          invoke-virtual      { v10 }, LTest;->a()LTest;",
+            "          invoke-virtual      { v4, v0, v1, v6, v7 }, LTest;->a(JJ)Ljava/util/List;",
+            "          move-result-object  v2",
+            "          invoke-interface    { v2 },"
+                + " Ljava/util/List;->iterator()Ljava/util/Iterator;",
+            "          move-result-object  v6",
+            "          move-wide           v2, v0",
+            "      :label_52",
+            "          invoke-interface    { v6 }, Ljava/util/Iterator;->hasNext()Z",
+            "          move-result         v0",
+            "          if-eqz              v0, :label_107",
+            "          invoke-interface    { v6 }, Ljava/util/Iterator;->next()Ljava/lang/Object;",
+            "          move-result-object  v0",
+            "          check-cast          v0, LTest;",
+            "          const-wide/16       v8, 0x0000000000000001  # 1",
+            "          add-long/2addr      v2, v8",
+            "          invoke-virtual      { v5 }, LTest;->newRow()LTest;",
+            "          move-result-object  v1",
+            "          invoke-static       { v2, v3 },"
+                + " Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;",
+            "          move-result-object  v7",
+            "          invoke-virtual      { v1, v7 }, LTest;->a(Ljava/lang/Object;)LTest;",
+            "          move-result-object  v1",
+            "          const-string        v7, \"add\"",
+            "          invoke-virtual      { v1, v7 }, LTest;->a(Ljava/lang/Object;)LTest;",
+            "          move-result-object  v1",
+            "          iget-object         v7, v0, LTest;->a:Ljava/lang/String;",
+            "          invoke-virtual      { v1, v7 }, LTest;->a(Ljava/lang/Object;)LTest;",
+            "          move-result-object  v1",
+            "          iget                v7, v0, LTest;->b:I",
+            "          invoke-static       { v7 },"
+                + " Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;",
+            "          move-result-object  v7",
+            "          invoke-virtual      { v1, v7 }, LTest;->add(Ljava/lang/Object;)LTest;",
+            "          move-result-object  v1",
+            "          iget-object         v0, v0, LTest;->a:Ljava/lang/String;",
+            "          invoke-virtual      { v1, v0 }, LTest;->add(Ljava/lang/Object;)LTest;",
+            "          goto                :label_52",
+            "      :label_107",
+            "          iget-object         v0, v4, LTest;->a:LTest;",
+            "          const-string        v1, \"text 1\"",
+            "          const/4             v2, 0x00  # 0",
+            "          invoke-virtual      { v0, v1, v2 }, LTest;->a(Ljava/lang/String;I)LTest;",
+            "          move-result-object  v0",
+            "          const-string        v1, \"text 2\"",
+            "          const-string        v2, \"\"",
+            "          invoke-interface    { v0, v1, v2 },"
+                + " LTest;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
+            "          move-result-object  v0",
+            "          invoke-static       { v5, v0 }, LTest;->a(LTest;Ljava/lang/String;)LTest;",
+            "          move-result-object  v0",
+            "          goto                :label_7");
     DexCode code = method.getCode().asDexCode();
     assertEquals(3, code.instructions.length);
-    assertTrue(code.instructions[0] instanceof InvokeVirtual);
-    assertTrue(code.instructions[1] instanceof Const4);
-    assertEquals(0, ((Const4) code.instructions[1]).B);
-    assertTrue(code.instructions[2] instanceof ReturnObject);
+    assertTrue(code.instructions[0] instanceof DexInvokeVirtual);
+    assertTrue(code.instructions[1] instanceof DexConst4);
+    assertEquals(0, ((DexConst4) code.instructions[1]).B);
+    assertTrue(code.instructions[2] instanceof DexReturnObject);
   }
 
   @Test
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 042bec1..10d96c1 100644
--- a/src/test/java/com/android/tools/r8/smali/OutlineTest.java
+++ b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
@@ -9,24 +9,24 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.code.Const4;
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.ConstWide;
-import com.android.tools.r8.code.ConstWideHigh16;
-import com.android.tools.r8.code.DivInt;
-import com.android.tools.r8.code.DivInt2Addr;
-import com.android.tools.r8.code.Goto;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.InvokeStatic;
-import com.android.tools.r8.code.InvokeStaticRange;
-import com.android.tools.r8.code.InvokeVirtual;
-import com.android.tools.r8.code.MoveResult;
-import com.android.tools.r8.code.MoveResultObject;
-import com.android.tools.r8.code.MoveResultWide;
-import com.android.tools.r8.code.Return;
-import com.android.tools.r8.code.ReturnObject;
-import com.android.tools.r8.code.ReturnVoid;
-import com.android.tools.r8.code.ReturnWide;
+import com.android.tools.r8.dex.code.DexConst4;
+import com.android.tools.r8.dex.code.DexConstString;
+import com.android.tools.r8.dex.code.DexConstWide;
+import com.android.tools.r8.dex.code.DexConstWideHigh16;
+import com.android.tools.r8.dex.code.DexDivInt;
+import com.android.tools.r8.dex.code.DexDivInt2Addr;
+import com.android.tools.r8.dex.code.DexGoto;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeStatic;
+import com.android.tools.r8.dex.code.DexInvokeStaticRange;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
+import com.android.tools.r8.dex.code.DexMoveResult;
+import com.android.tools.r8.dex.code.DexMoveResultObject;
+import com.android.tools.r8.dex.code.DexMoveResultWide;
+import com.android.tools.r8.dex.code.DexReturn;
+import com.android.tools.r8.dex.code.DexReturnObject;
+import com.android.tools.r8.dex.code.DexReturnVoid;
+import com.android.tools.r8.dex.code.DexReturnWide;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -158,9 +158,9 @@
       DexEncodedMethod method = getMethod(processedApplication, signature);
 
       DexCode code = method.getCode().asDexCode();
-      assertTrue(code.instructions[0] instanceof ConstString);
-      assertTrue(code.instructions[1] instanceof InvokeStatic);
-      InvokeStatic invoke = (InvokeStatic) code.instructions[1];
+      assertTrue(code.instructions[0] instanceof DexConstString);
+      assertTrue(code.instructions[1] instanceof DexInvokeStatic);
+      DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[1];
       assertTrue(isOutlineMethodName(invoke.getMethod()));
 
       // Run code and check result.
@@ -230,10 +230,10 @@
       // Up to 4 const instructions before the invoke of the outline.
       int firstOutlineInvoke = Math.min(i, 4);
       for (int j = 0; j < firstOutlineInvoke; j++) {
-        assertTrue(code.instructions[j] instanceof ConstString);
+        assertTrue(code.instructions[j] instanceof DexConstString);
       }
-      assertTrue(code.instructions[firstOutlineInvoke] instanceof InvokeStatic);
-      InvokeStatic invoke = (InvokeStatic) code.instructions[firstOutlineInvoke];
+      assertTrue(code.instructions[firstOutlineInvoke] instanceof DexInvokeStatic);
+      DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[firstOutlineInvoke];
       assertTrue(isOutlineMethodName(invoke.getMethod()));
 
       // Run code and check result.
@@ -287,9 +287,9 @@
     DexEncodedMethod method = getMethod(processedApplication, signature);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof ConstString);
-    assertTrue(code.instructions[1] instanceof InvokeStatic);
-    InvokeStatic invoke = (InvokeStatic) code.instructions[1];
+    assertTrue(code.instructions[0] instanceof DexConstString);
+    assertTrue(code.instructions[1] instanceof DexInvokeStatic);
+    DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[1];
     assertTrue(isOutlineMethodName(invoke.getMethod()));
 
     // Run code and check result.
@@ -349,10 +349,10 @@
     DexEncodedMethod method = getMethod(processedApplication, signature);
 
     DexCode code = method.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof ConstString);
-    assertTrue(code.instructions[1] instanceof ConstString);
-    assertTrue(code.instructions[2] instanceof InvokeStatic);
-    InvokeStatic invoke = (InvokeStatic) code.instructions[2];
+    assertTrue(code.instructions[0] instanceof DexConstString);
+    assertTrue(code.instructions[1] instanceof DexConstString);
+    assertTrue(code.instructions[2] instanceof DexInvokeStatic);
+    DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[2];
     assertTrue(isOutlineMethodName(invoke.getMethod()));
 
     // Run code and check result.
@@ -414,16 +414,16 @@
       DexEncodedMethod method = getMethod(processedApplication, signature);
 
       DexCode code = method.getCode().asDexCode();
-      assertTrue(code.instructions[0] instanceof ConstWide);
+      assertTrue(code.instructions[0] instanceof DexConstWide);
       if (i < 3) {
-        assertTrue(code.instructions[1] instanceof InvokeStatic);
-        InvokeStatic invoke = (InvokeStatic) code.instructions[1];
+        assertTrue(code.instructions[1] instanceof DexInvokeStatic);
+        DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[1];
         assertTrue(isOutlineMethodName(invoke.getMethod()));
       } else {
-        assertTrue(code.instructions[1] instanceof InvokeVirtual);
-        assertTrue(code.instructions[2] instanceof InvokeVirtual);
-        assertTrue(code.instructions[3] instanceof InvokeStatic);
-        InvokeStatic invoke = (InvokeStatic) code.instructions[3];
+        assertTrue(code.instructions[1] instanceof DexInvokeVirtual);
+        assertTrue(code.instructions[2] instanceof DexInvokeVirtual);
+        assertTrue(code.instructions[3] instanceof DexInvokeStatic);
+        DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[3];
         assertTrue(isOutlineMethodName(invoke.getMethod()));
       }
 
@@ -491,16 +491,16 @@
       DexEncodedMethod method = getMethod(processedApplication, signature);
 
       DexCode code = method.getCode().asDexCode();
-      assertTrue(code.instructions[0] instanceof ConstWideHigh16);
+      assertTrue(code.instructions[0] instanceof DexConstWideHigh16);
       if (i < 3) {
-        assertTrue(code.instructions[1] instanceof InvokeStatic);
-        InvokeStatic invoke = (InvokeStatic) code.instructions[1];
+        assertTrue(code.instructions[1] instanceof DexInvokeStatic);
+        DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[1];
         assertTrue(isOutlineMethodName(invoke.getMethod()));
       } else {
-        assertTrue(code.instructions[1] instanceof InvokeVirtual);
-        assertTrue(code.instructions[2] instanceof InvokeVirtual);
-        assertTrue(code.instructions[3] instanceof InvokeStatic);
-        InvokeStatic invoke = (InvokeStatic) code.instructions[3];
+        assertTrue(code.instructions[1] instanceof DexInvokeVirtual);
+        assertTrue(code.instructions[2] instanceof DexInvokeVirtual);
+        assertTrue(code.instructions[3] instanceof DexInvokeStatic);
+        DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[3];
         assertTrue(isOutlineMethodName(invoke.getMethod()));
       }
 
@@ -572,14 +572,14 @@
         assert mainCode.instructions.length == 7;
       }
       if (i == 2) {
-        InvokeStatic invoke = (InvokeStatic) mainCode.instructions[4];
+        DexInvokeStatic invoke = (DexInvokeStatic) mainCode.instructions[4];
         assertTrue(isOutlineMethodName(invoke.getMethod()));
       } else if (i == 3) {
-        InvokeStatic invoke = (InvokeStatic) mainCode.instructions[1];
+        DexInvokeStatic invoke = (DexInvokeStatic) mainCode.instructions[1];
         assertTrue(isOutlineMethodName(invoke.getMethod()));
       } else {
         assert i == 4 || i == 5;
-        InvokeStatic invoke = (InvokeStatic) mainCode.instructions[2];
+        DexInvokeStatic invoke = (DexInvokeStatic) mainCode.instructions[2];
         assertTrue(isOutlineMethodName(invoke.getMethod()));
       }
 
@@ -661,14 +661,14 @@
 
     DexCode code1 = getMethod(processedApplication, signature1).getCode().asDexCode();
     assertEquals(4, code1.instructions.length);
-    assertTrue(code1.instructions[1] instanceof InvokeStatic);
-    InvokeStatic invoke1 = (InvokeStatic) code1.instructions[1];
+    assertTrue(code1.instructions[1] instanceof DexInvokeStatic);
+    DexInvokeStatic invoke1 = (DexInvokeStatic) code1.instructions[1];
     assertTrue(isOutlineMethodName(invoke1.getMethod()));
 
     DexCode code2 = getMethod(processedApplication, signature2).getCode().asDexCode();
     assertEquals(5, code2.instructions.length);
-    assertTrue(code2.instructions[2] instanceof InvokeStatic);
-    InvokeStatic invoke2 = (InvokeStatic) code2.instructions[2];
+    assertTrue(code2.instructions[2] instanceof DexInvokeStatic);
+    DexInvokeStatic invoke2 = (DexInvokeStatic) code2.instructions[2];
     assertTrue(isOutlineMethodName(invoke1.getMethod()));
 
     // Run code and check result.
@@ -739,12 +739,12 @@
         default:
           outlineInstructionIndex = 2;
       }
-      Instruction instruction = code.instructions[outlineInstructionIndex];
-      if (instruction instanceof InvokeStatic) {
-        InvokeStatic invoke = (InvokeStatic) instruction;
+      DexInstruction instruction = code.instructions[outlineInstructionIndex];
+      if (instruction instanceof DexInvokeStatic) {
+        DexInvokeStatic invoke = (DexInvokeStatic) instruction;
         assertTrue(isOutlineMethodName(invoke.getMethod()));
       } else {
-        InvokeStaticRange invoke = (InvokeStaticRange) instruction;
+        DexInvokeStaticRange invoke = (DexInvokeStaticRange) instruction;
         assertTrue(isOutlineMethodName(invoke.getMethod()));
       }
 
@@ -791,9 +791,9 @@
     assertEquals(2, getNumberOfProgramClasses(processedApplication));
 
     DexCode code = getMethod(processedApplication, signature1).getCode().asDexCode();
-    InvokeStatic invoke;
-    assertTrue(code.instructions[0] instanceof InvokeStatic);
-    invoke = (InvokeStatic) code.instructions[0];
+    DexInvokeStatic invoke;
+    assertTrue(code.instructions[0] instanceof DexInvokeStatic);
+    invoke = (DexInvokeStatic) code.instructions[0];
     assertTrue(isOutlineMethodName(invoke.getMethod()));
 
     // Run code and check result.
@@ -871,7 +871,7 @@
     // Collect the return types of the outlines for the body of method1 and method2.
     List<DexType> r = new ArrayList<>();
     for (DexEncodedMethod directMethod : outlineMethods) {
-      if (directMethod.getCode().asDexCode().instructions[0] instanceof InvokeVirtual) {
+      if (directMethod.getCode().asDexCode().instructions[0] instanceof DexInvokeVirtual) {
         r.add(directMethod.getReference().proto.returnType);
       }
     }
@@ -1022,10 +1022,10 @@
     // The calls to set, set and getTimeInMillis was outlined.
     DexCode code = method.getCode().asDexCode();
     assertEquals(3, code.instructions.length);
-    assertTrue(code.instructions[0] instanceof InvokeStatic);
-    assertTrue(code.instructions[1] instanceof MoveResultWide);
-    assertTrue(code.instructions[2] instanceof ReturnWide);
-    InvokeStatic invoke = (InvokeStatic) code.instructions[0];
+    assertTrue(code.instructions[0] instanceof DexInvokeStatic);
+    assertTrue(code.instructions[1] instanceof DexMoveResultWide);
+    assertTrue(code.instructions[2] instanceof DexReturnWide);
+    DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[0];
     assertEquals(firstOutlineMethodName(), invoke.getMethod().qualifiedName());
 
     // Run the code and expect a parsable long.
@@ -1139,9 +1139,9 @@
     DexEncodedMethod method = getMethod(processedApplication, signature);
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
-    assertTrue(code.instructions[0] instanceof InvokeStatic);
-    assertTrue(code.instructions[1] instanceof ReturnObject);
-    InvokeStatic invoke = (InvokeStatic) code.instructions[0];
+    assertTrue(code.instructions[0] instanceof DexInvokeStatic);
+    assertTrue(code.instructions[1] instanceof DexReturnObject);
+    DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[0];
     assertEquals(firstOutlineMethodName(), invoke.getMethod().qualifiedName());
 
     // Run code and check result.
@@ -1215,16 +1215,16 @@
     DexEncodedMethod method1 = getMethod(processedApplication, signature1);
     DexCode code1 = method1.getCode().asDexCode();
     assertEquals(3, code1.instructions.length);
-    assertTrue(code1.instructions[0] instanceof InvokeStatic);
-    assertTrue(code1.instructions[1] instanceof MoveResult);
-    assertTrue(code1.instructions[2] instanceof Return);
-    InvokeStatic invoke1 = (InvokeStatic) code1.instructions[0];
+    assertTrue(code1.instructions[0] instanceof DexInvokeStatic);
+    assertTrue(code1.instructions[1] instanceof DexMoveResult);
+    assertTrue(code1.instructions[2] instanceof DexReturn);
+    DexInvokeStatic invoke1 = (DexInvokeStatic) code1.instructions[0];
     assertTrue(isOutlineMethodName(invoke1.getMethod()));
 
     DexEncodedMethod method2 = getMethod(processedApplication, signature2);
     DexCode code2 = method2.getCode().asDexCode();
-    assertTrue(code2.instructions[0] instanceof InvokeStatic);
-    InvokeStatic invoke2 = (InvokeStatic) code2.instructions[0];
+    assertTrue(code2.instructions[0] instanceof DexInvokeStatic);
+    DexInvokeStatic invoke2 = (DexInvokeStatic) code2.instructions[0];
     assertEquals(invoke1.getMethod().qualifiedName(), invoke2.getMethod().qualifiedName());
 
     // Run code and check result.
@@ -1293,14 +1293,14 @@
     DexEncodedMethod method = getMethod(processedApplication, signature);
     DexCode code = method.getCode().asDexCode();
     assertEquals(7, code.instructions.length);
-    assertTrue(code.instructions[0] instanceof DivInt);
-    assertTrue(code.instructions[1] instanceof InvokeStatic);
-    assertTrue(code.instructions[2] instanceof MoveResult);
-    assertTrue(code.instructions[3] instanceof DivInt2Addr);
-    assertTrue(code.instructions[4] instanceof Goto);
-    assertTrue(code.instructions[5] instanceof Const4);
-    assertTrue(code.instructions[6] instanceof Return);
-    InvokeStatic invoke = (InvokeStatic) code.instructions[1];
+    assertTrue(code.instructions[0] instanceof DexDivInt);
+    assertTrue(code.instructions[1] instanceof DexInvokeStatic);
+    assertTrue(code.instructions[2] instanceof DexMoveResult);
+    assertTrue(code.instructions[3] instanceof DexDivInt2Addr);
+    assertTrue(code.instructions[4] instanceof DexGoto);
+    assertTrue(code.instructions[5] instanceof DexConst4);
+    assertTrue(code.instructions[6] instanceof DexReturn);
+    DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[1];
     assertTrue(isOutlineMethodName(invoke.getMethod()));
 
     // Run code and check result.
@@ -1347,10 +1347,10 @@
     DexEncodedMethod method = getMethod(processedApplication, signature);
     DexCode code = method.getCode().asDexCode();
     assertEquals(3, code.instructions.length);
-    assertTrue(code.instructions[0] instanceof InvokeStatic);
-    assertTrue(code.instructions[1] instanceof MoveResultObject);
-    assertTrue(code.instructions[2] instanceof ReturnObject);
-    InvokeStatic invoke = (InvokeStatic) code.instructions[0];
+    assertTrue(code.instructions[0] instanceof DexInvokeStatic);
+    assertTrue(code.instructions[1] instanceof DexMoveResultObject);
+    assertTrue(code.instructions[2] instanceof DexReturnObject);
+    DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[0];
     assertEquals(firstOutlineMethodName(), invoke.getMethod().qualifiedName());
 
     // Run code and check result.
@@ -1405,9 +1405,9 @@
     DexEncodedMethod method = getMethod(processedApplication, signature);
     DexCode code = method.getCode().asDexCode();
     assertEquals(2, code.instructions.length);
-    assertTrue(code.instructions[0] instanceof InvokeStatic);
-    assertTrue(code.instructions[1] instanceof ReturnVoid);
-    InvokeStatic invoke = (InvokeStatic) code.instructions[0];
+    assertTrue(code.instructions[0] instanceof DexInvokeStatic);
+    assertTrue(code.instructions[1] instanceof DexReturnVoid);
+    DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[0];
     assertEquals(firstOutlineMethodName(), invoke.getMethod().qualifiedName());
 
     // Run code and check result.
@@ -1635,8 +1635,8 @@
     runDex2Oat(processedApplication);
   }
 
-  private static boolean isOutlineInvoke(Instruction instruction) {
-    return instruction instanceof InvokeStatic && isOutlineMethodName(instruction.getMethod());
+  private static boolean isOutlineInvoke(DexInstruction instruction) {
+    return instruction instanceof DexInvokeStatic && isOutlineMethodName(instruction.getMethod());
   }
 
   private void assertHasOutlineInvoke(DexEncodedMethod method) {
diff --git a/src/test/java/com/android/tools/r8/smali/RunArtSmokeTest.java b/src/test/java/com/android/tools/r8/smali/RunArtSmokeTest.java
index 4d13ae0..00e8d8f 100644
--- a/src/test/java/com/android/tools/r8/smali/RunArtSmokeTest.java
+++ b/src/test/java/com/android/tools/r8/smali/RunArtSmokeTest.java
@@ -8,10 +8,10 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.InvokeVirtual;
-import com.android.tools.r8.code.ReturnVoid;
-import com.android.tools.r8.code.SgetObject;
+import com.android.tools.r8.dex.code.DexConstString;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
+import com.android.tools.r8.dex.code.DexReturnVoid;
+import com.android.tools.r8.dex.code.DexSgetObject;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
@@ -42,10 +42,10 @@
     assertNotNull(main);
 
     DexCode code = main.getCode().asDexCode();
-    assertTrue(code.instructions[0] instanceof SgetObject);
-    assertTrue(code.instructions[1] instanceof ConstString);
-    assertTrue(code.instructions[2] instanceof InvokeVirtual);
-    assertTrue(code.instructions[3] instanceof ReturnVoid);
+    assertTrue(code.instructions[0] instanceof DexSgetObject);
+    assertTrue(code.instructions[1] instanceof DexConstString);
+    assertTrue(code.instructions[2] instanceof DexInvokeVirtual);
+    assertTrue(code.instructions[3] instanceof DexReturnVoid);
 
     // Run the generated code in Art.
     String result = runArt(processedApplication);
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastDexInstructionSubject.java
index ea10ad4..671ec25 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastDexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastDexInstructionSubject.java
@@ -4,20 +4,20 @@
 
 package com.android.tools.r8.utils.codeinspector;
 
-import com.android.tools.r8.code.CheckCast;
-import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.code.DexCheckCast;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.graph.DexType;
 
 public class CheckCastDexInstructionSubject extends DexInstructionSubject
     implements CheckCastInstructionSubject {
-  public CheckCastDexInstructionSubject(Instruction instruction, MethodSubject method) {
+  public CheckCastDexInstructionSubject(DexInstruction instruction, MethodSubject method) {
     super(instruction, method);
     assert isCheckCast();
   }
 
   @Override
   public DexType getType() {
-    return ((CheckCast) instruction).getType();
+    return ((DexCheckCast) instruction).getType();
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index d9869b2..44942ab 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -8,9 +8,9 @@
 import com.android.tools.r8.TestDiagnosticMessagesImpl;
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfTryCatch;
-import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.dex.Marker;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.graph.CfCode;
 import com.android.tools.r8.graph.Code;
@@ -391,7 +391,9 @@
   }
 
   InstructionSubject createInstructionSubject(
-      Instruction instruction, MethodSubject method, SwitchPayloadResolver switchPayloadResolver) {
+      DexInstruction instruction,
+      MethodSubject method,
+      SwitchPayloadResolver switchPayloadResolver) {
     DexInstructionSubject dexInst = new DexInstructionSubject(instruction, method);
     if (dexInst.isInvoke()) {
       return new InvokeDexInstructionSubject(this, instruction, method);
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java
index ddff370..62da578 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java
@@ -4,25 +4,25 @@
 
 package com.android.tools.r8.utils.codeinspector;
 
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.ConstStringJumbo;
-import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.code.DexConstString;
+import com.android.tools.r8.dex.code.DexConstStringJumbo;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.graph.DexString;
 
 public class ConstStringDexInstructionSubject extends DexInstructionSubject
     implements ConstStringInstructionSubject {
-  public ConstStringDexInstructionSubject(Instruction instruction, MethodSubject method) {
+  public ConstStringDexInstructionSubject(DexInstruction instruction, MethodSubject method) {
     super(instruction, method);
     assert isConstString(JumboStringMode.ALLOW);
   }
 
   @Override
   public DexString getString() {
-    if (instruction instanceof ConstString) {
-      return ((ConstString) instruction).getString();
+    if (instruction instanceof DexConstString) {
+      return ((DexConstString) instruction).getString();
     } else {
-      assert (instruction instanceof ConstStringJumbo);
-      return ((ConstStringJumbo) instruction).getString();
+      assert (instruction instanceof DexConstStringJumbo);
+      return ((DexConstStringJumbo) instruction).getString();
     }
   }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java
index 1ea464c..31b85c3 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.utils.codeinspector;
 
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.SwitchPayload;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexSwitchPayload;
 import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.ir.conversion.SwitchPayloadResolver;
@@ -49,12 +49,12 @@
   private void ensureSwitchPayloadResolver() {
     if (switchPayloadResolver == null) {
       switchPayloadResolver = new SwitchPayloadResolver();
-      for (Instruction instruction : code.instructions) {
+      for (DexInstruction instruction : code.instructions) {
         if (instruction.isIntSwitch()) {
           switchPayloadResolver.addPayloadUser(instruction);
         }
         if (instruction.isSwitchPayload()) {
-          switchPayloadResolver.resolve((SwitchPayload) instruction);
+          switchPayloadResolver.resolve((DexSwitchPayload) instruction);
         }
       }
     }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
index 00cfc92..2785f57 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
@@ -4,109 +4,109 @@
 
 package com.android.tools.r8.utils.codeinspector;
 
-import com.android.tools.r8.code.Aget;
-import com.android.tools.r8.code.AgetBoolean;
-import com.android.tools.r8.code.AgetByte;
-import com.android.tools.r8.code.AgetChar;
-import com.android.tools.r8.code.AgetObject;
-import com.android.tools.r8.code.AgetShort;
-import com.android.tools.r8.code.AgetWide;
-import com.android.tools.r8.code.Aput;
-import com.android.tools.r8.code.AputBoolean;
-import com.android.tools.r8.code.AputByte;
-import com.android.tools.r8.code.AputChar;
-import com.android.tools.r8.code.AputObject;
-import com.android.tools.r8.code.AputShort;
-import com.android.tools.r8.code.AputWide;
-import com.android.tools.r8.code.ArrayLength;
-import com.android.tools.r8.code.CheckCast;
-import com.android.tools.r8.code.Const;
-import com.android.tools.r8.code.Const16;
-import com.android.tools.r8.code.Const4;
-import com.android.tools.r8.code.ConstClass;
-import com.android.tools.r8.code.ConstHigh16;
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.ConstStringJumbo;
-import com.android.tools.r8.code.ConstWide;
-import com.android.tools.r8.code.ConstWide16;
-import com.android.tools.r8.code.ConstWide32;
-import com.android.tools.r8.code.ConstWideHigh16;
-import com.android.tools.r8.code.Goto;
-import com.android.tools.r8.code.IfEq;
-import com.android.tools.r8.code.IfEqz;
-import com.android.tools.r8.code.IfGe;
-import com.android.tools.r8.code.IfGez;
-import com.android.tools.r8.code.IfGt;
-import com.android.tools.r8.code.IfGtz;
-import com.android.tools.r8.code.IfLe;
-import com.android.tools.r8.code.IfLez;
-import com.android.tools.r8.code.IfLt;
-import com.android.tools.r8.code.IfLtz;
-import com.android.tools.r8.code.IfNe;
-import com.android.tools.r8.code.IfNez;
-import com.android.tools.r8.code.Iget;
-import com.android.tools.r8.code.IgetBoolean;
-import com.android.tools.r8.code.IgetByte;
-import com.android.tools.r8.code.IgetChar;
-import com.android.tools.r8.code.IgetObject;
-import com.android.tools.r8.code.IgetShort;
-import com.android.tools.r8.code.IgetWide;
-import com.android.tools.r8.code.InstanceOf;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.InvokeCustom;
-import com.android.tools.r8.code.InvokeCustomRange;
-import com.android.tools.r8.code.InvokeDirect;
-import com.android.tools.r8.code.InvokeDirectRange;
-import com.android.tools.r8.code.InvokeInterface;
-import com.android.tools.r8.code.InvokeInterfaceRange;
-import com.android.tools.r8.code.InvokeStatic;
-import com.android.tools.r8.code.InvokeStaticRange;
-import com.android.tools.r8.code.InvokeSuper;
-import com.android.tools.r8.code.InvokeSuperRange;
-import com.android.tools.r8.code.InvokeVirtual;
-import com.android.tools.r8.code.InvokeVirtualRange;
-import com.android.tools.r8.code.Iput;
-import com.android.tools.r8.code.IputBoolean;
-import com.android.tools.r8.code.IputByte;
-import com.android.tools.r8.code.IputChar;
-import com.android.tools.r8.code.IputObject;
-import com.android.tools.r8.code.IputShort;
-import com.android.tools.r8.code.IputWide;
-import com.android.tools.r8.code.MonitorEnter;
-import com.android.tools.r8.code.MonitorExit;
-import com.android.tools.r8.code.MulDouble;
-import com.android.tools.r8.code.MulDouble2Addr;
-import com.android.tools.r8.code.MulFloat;
-import com.android.tools.r8.code.MulFloat2Addr;
-import com.android.tools.r8.code.MulInt;
-import com.android.tools.r8.code.MulInt2Addr;
-import com.android.tools.r8.code.MulIntLit16;
-import com.android.tools.r8.code.MulIntLit8;
-import com.android.tools.r8.code.MulLong;
-import com.android.tools.r8.code.MulLong2Addr;
-import com.android.tools.r8.code.NewArray;
-import com.android.tools.r8.code.NewInstance;
-import com.android.tools.r8.code.Nop;
-import com.android.tools.r8.code.PackedSwitch;
-import com.android.tools.r8.code.Return;
-import com.android.tools.r8.code.ReturnObject;
-import com.android.tools.r8.code.ReturnVoid;
-import com.android.tools.r8.code.Sget;
-import com.android.tools.r8.code.SgetBoolean;
-import com.android.tools.r8.code.SgetByte;
-import com.android.tools.r8.code.SgetChar;
-import com.android.tools.r8.code.SgetObject;
-import com.android.tools.r8.code.SgetShort;
-import com.android.tools.r8.code.SgetWide;
-import com.android.tools.r8.code.SparseSwitch;
-import com.android.tools.r8.code.Sput;
-import com.android.tools.r8.code.SputBoolean;
-import com.android.tools.r8.code.SputByte;
-import com.android.tools.r8.code.SputChar;
-import com.android.tools.r8.code.SputObject;
-import com.android.tools.r8.code.SputShort;
-import com.android.tools.r8.code.SputWide;
-import com.android.tools.r8.code.Throw;
+import com.android.tools.r8.dex.code.DexAget;
+import com.android.tools.r8.dex.code.DexAgetBoolean;
+import com.android.tools.r8.dex.code.DexAgetByte;
+import com.android.tools.r8.dex.code.DexAgetChar;
+import com.android.tools.r8.dex.code.DexAgetObject;
+import com.android.tools.r8.dex.code.DexAgetShort;
+import com.android.tools.r8.dex.code.DexAgetWide;
+import com.android.tools.r8.dex.code.DexAput;
+import com.android.tools.r8.dex.code.DexAputBoolean;
+import com.android.tools.r8.dex.code.DexAputByte;
+import com.android.tools.r8.dex.code.DexAputChar;
+import com.android.tools.r8.dex.code.DexAputObject;
+import com.android.tools.r8.dex.code.DexAputShort;
+import com.android.tools.r8.dex.code.DexAputWide;
+import com.android.tools.r8.dex.code.DexArrayLength;
+import com.android.tools.r8.dex.code.DexCheckCast;
+import com.android.tools.r8.dex.code.DexConst;
+import com.android.tools.r8.dex.code.DexConst16;
+import com.android.tools.r8.dex.code.DexConst4;
+import com.android.tools.r8.dex.code.DexConstClass;
+import com.android.tools.r8.dex.code.DexConstHigh16;
+import com.android.tools.r8.dex.code.DexConstString;
+import com.android.tools.r8.dex.code.DexConstStringJumbo;
+import com.android.tools.r8.dex.code.DexConstWide;
+import com.android.tools.r8.dex.code.DexConstWide16;
+import com.android.tools.r8.dex.code.DexConstWide32;
+import com.android.tools.r8.dex.code.DexConstWideHigh16;
+import com.android.tools.r8.dex.code.DexGoto;
+import com.android.tools.r8.dex.code.DexIfEq;
+import com.android.tools.r8.dex.code.DexIfEqz;
+import com.android.tools.r8.dex.code.DexIfGe;
+import com.android.tools.r8.dex.code.DexIfGez;
+import com.android.tools.r8.dex.code.DexIfGt;
+import com.android.tools.r8.dex.code.DexIfGtz;
+import com.android.tools.r8.dex.code.DexIfLe;
+import com.android.tools.r8.dex.code.DexIfLez;
+import com.android.tools.r8.dex.code.DexIfLt;
+import com.android.tools.r8.dex.code.DexIfLtz;
+import com.android.tools.r8.dex.code.DexIfNe;
+import com.android.tools.r8.dex.code.DexIfNez;
+import com.android.tools.r8.dex.code.DexIget;
+import com.android.tools.r8.dex.code.DexIgetBoolean;
+import com.android.tools.r8.dex.code.DexIgetByte;
+import com.android.tools.r8.dex.code.DexIgetChar;
+import com.android.tools.r8.dex.code.DexIgetObject;
+import com.android.tools.r8.dex.code.DexIgetShort;
+import com.android.tools.r8.dex.code.DexIgetWide;
+import com.android.tools.r8.dex.code.DexInstanceOf;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexInvokeCustom;
+import com.android.tools.r8.dex.code.DexInvokeCustomRange;
+import com.android.tools.r8.dex.code.DexInvokeDirect;
+import com.android.tools.r8.dex.code.DexInvokeDirectRange;
+import com.android.tools.r8.dex.code.DexInvokeInterface;
+import com.android.tools.r8.dex.code.DexInvokeInterfaceRange;
+import com.android.tools.r8.dex.code.DexInvokeStatic;
+import com.android.tools.r8.dex.code.DexInvokeStaticRange;
+import com.android.tools.r8.dex.code.DexInvokeSuper;
+import com.android.tools.r8.dex.code.DexInvokeSuperRange;
+import com.android.tools.r8.dex.code.DexInvokeVirtual;
+import com.android.tools.r8.dex.code.DexInvokeVirtualRange;
+import com.android.tools.r8.dex.code.DexIput;
+import com.android.tools.r8.dex.code.DexIputBoolean;
+import com.android.tools.r8.dex.code.DexIputByte;
+import com.android.tools.r8.dex.code.DexIputChar;
+import com.android.tools.r8.dex.code.DexIputObject;
+import com.android.tools.r8.dex.code.DexIputShort;
+import com.android.tools.r8.dex.code.DexIputWide;
+import com.android.tools.r8.dex.code.DexMonitorEnter;
+import com.android.tools.r8.dex.code.DexMonitorExit;
+import com.android.tools.r8.dex.code.DexMulDouble;
+import com.android.tools.r8.dex.code.DexMulDouble2Addr;
+import com.android.tools.r8.dex.code.DexMulFloat;
+import com.android.tools.r8.dex.code.DexMulFloat2Addr;
+import com.android.tools.r8.dex.code.DexMulInt;
+import com.android.tools.r8.dex.code.DexMulInt2Addr;
+import com.android.tools.r8.dex.code.DexMulIntLit16;
+import com.android.tools.r8.dex.code.DexMulIntLit8;
+import com.android.tools.r8.dex.code.DexMulLong;
+import com.android.tools.r8.dex.code.DexMulLong2Addr;
+import com.android.tools.r8.dex.code.DexNewArray;
+import com.android.tools.r8.dex.code.DexNewInstance;
+import com.android.tools.r8.dex.code.DexNop;
+import com.android.tools.r8.dex.code.DexPackedSwitch;
+import com.android.tools.r8.dex.code.DexReturn;
+import com.android.tools.r8.dex.code.DexReturnObject;
+import com.android.tools.r8.dex.code.DexReturnVoid;
+import com.android.tools.r8.dex.code.DexSget;
+import com.android.tools.r8.dex.code.DexSgetBoolean;
+import com.android.tools.r8.dex.code.DexSgetByte;
+import com.android.tools.r8.dex.code.DexSgetChar;
+import com.android.tools.r8.dex.code.DexSgetObject;
+import com.android.tools.r8.dex.code.DexSgetShort;
+import com.android.tools.r8.dex.code.DexSgetWide;
+import com.android.tools.r8.dex.code.DexSparseSwitch;
+import com.android.tools.r8.dex.code.DexSput;
+import com.android.tools.r8.dex.code.DexSputBoolean;
+import com.android.tools.r8.dex.code.DexSputByte;
+import com.android.tools.r8.dex.code.DexSputChar;
+import com.android.tools.r8.dex.code.DexSputObject;
+import com.android.tools.r8.dex.code.DexSputShort;
+import com.android.tools.r8.dex.code.DexSputWide;
+import com.android.tools.r8.dex.code.DexThrow;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.ir.code.SingleConstant;
@@ -114,10 +114,10 @@
 
 public class DexInstructionSubject implements InstructionSubject {
 
-  protected final Instruction instruction;
+  protected final DexInstruction instruction;
   protected final MethodSubject method;
 
-  public DexInstructionSubject(Instruction instruction, MethodSubject method) {
+  public DexInstructionSubject(DexInstruction instruction, MethodSubject method) {
     this.instruction = instruction;
     this.method = method;
   }
@@ -149,46 +149,46 @@
 
   @Override
   public boolean isInstanceGet() {
-    return instruction instanceof Iget
-        || instruction instanceof IgetBoolean
-        || instruction instanceof IgetByte
-        || instruction instanceof IgetShort
-        || instruction instanceof IgetChar
-        || instruction instanceof IgetWide
-        || instruction instanceof IgetObject;
+    return instruction instanceof DexIget
+        || instruction instanceof DexIgetBoolean
+        || instruction instanceof DexIgetByte
+        || instruction instanceof DexIgetShort
+        || instruction instanceof DexIgetChar
+        || instruction instanceof DexIgetWide
+        || instruction instanceof DexIgetObject;
   }
 
   @Override
   public boolean isInstancePut() {
-    return instruction instanceof Iput
-        || instruction instanceof IputBoolean
-        || instruction instanceof IputByte
-        || instruction instanceof IputShort
-        || instruction instanceof IputChar
-        || instruction instanceof IputWide
-        || instruction instanceof IputObject;
+    return instruction instanceof DexIput
+        || instruction instanceof DexIputBoolean
+        || instruction instanceof DexIputByte
+        || instruction instanceof DexIputShort
+        || instruction instanceof DexIputChar
+        || instruction instanceof DexIputWide
+        || instruction instanceof DexIputObject;
   }
 
   @Override
   public boolean isStaticGet() {
-    return instruction instanceof Sget
-        || instruction instanceof SgetBoolean
-        || instruction instanceof SgetByte
-        || instruction instanceof SgetShort
-        || instruction instanceof SgetChar
-        || instruction instanceof SgetWide
-        || instruction instanceof SgetObject;
+    return instruction instanceof DexSget
+        || instruction instanceof DexSgetBoolean
+        || instruction instanceof DexSgetByte
+        || instruction instanceof DexSgetShort
+        || instruction instanceof DexSgetChar
+        || instruction instanceof DexSgetWide
+        || instruction instanceof DexSgetObject;
   }
 
   @Override
   public boolean isStaticPut() {
-    return instruction instanceof Sput
-        || instruction instanceof SputBoolean
-        || instruction instanceof SputByte
-        || instruction instanceof SputShort
-        || instruction instanceof SputChar
-        || instruction instanceof SputWide
-        || instruction instanceof SputObject;
+    return instruction instanceof DexSput
+        || instruction instanceof DexSputBoolean
+        || instruction instanceof DexSputByte
+        || instruction instanceof DexSputShort
+        || instruction instanceof DexSputChar
+        || instruction instanceof DexSputWide
+        || instruction instanceof DexSputObject;
   }
 
   @Override
@@ -208,17 +208,18 @@
 
   @Override
   public boolean isInvokeVirtual() {
-    return instruction instanceof InvokeVirtual || instruction instanceof InvokeVirtualRange;
+    return instruction instanceof DexInvokeVirtual || instruction instanceof DexInvokeVirtualRange;
   }
 
   @Override
   public boolean isInvokeInterface() {
-    return instruction instanceof InvokeInterface || instruction instanceof InvokeInterfaceRange;
+    return instruction instanceof DexInvokeInterface
+        || instruction instanceof DexInvokeInterfaceRange;
   }
 
   @Override
   public boolean isInvokeStatic() {
-    return instruction instanceof InvokeStatic || instruction instanceof InvokeStaticRange;
+    return instruction instanceof DexInvokeStatic || instruction instanceof DexInvokeStaticRange;
   }
 
   @Override
@@ -227,15 +228,15 @@
   }
 
   public boolean isInvokeCustom() {
-    return instruction instanceof InvokeCustom || instruction instanceof InvokeCustomRange;
+    return instruction instanceof DexInvokeCustom || instruction instanceof DexInvokeCustomRange;
   }
 
   public boolean isInvokeSuper() {
-    return instruction instanceof InvokeSuper || instruction instanceof InvokeSuperRange;
+    return instruction instanceof DexInvokeSuper || instruction instanceof DexInvokeSuperRange;
   }
 
   public boolean isInvokeDirect() {
-    return instruction instanceof InvokeDirect || instruction instanceof InvokeDirectRange;
+    return instruction instanceof DexInvokeDirect || instruction instanceof DexInvokeDirectRange;
   }
 
   @Override
@@ -246,19 +247,19 @@
 
   @Override
   public boolean isNop() {
-    return instruction instanceof Nop;
+    return instruction instanceof DexNop;
   }
 
   @Override
   public boolean isConstNumber() {
-    return instruction instanceof Const
-        || instruction instanceof Const4
-        || instruction instanceof Const16
-        || instruction instanceof ConstHigh16
-        || instruction instanceof ConstWide
-        || instruction instanceof ConstWide16
-        || instruction instanceof ConstWide32
-        || instruction instanceof ConstWideHigh16;
+    return instruction instanceof DexConst
+        || instruction instanceof DexConst4
+        || instruction instanceof DexConst16
+        || instruction instanceof DexConstHigh16
+        || instruction instanceof DexConstWide
+        || instruction instanceof DexConstWide16
+        || instruction instanceof DexConstWide32
+        || instruction instanceof DexConstWideHigh16;
   }
 
   @Override
@@ -273,22 +274,22 @@
 
   @Override
   public boolean isConstString(JumboStringMode jumboStringMode) {
-    return instruction instanceof ConstString
-        || (jumboStringMode == JumboStringMode.ALLOW && instruction instanceof ConstStringJumbo);
+    return instruction instanceof DexConstString
+        || (jumboStringMode == JumboStringMode.ALLOW && instruction instanceof DexConstStringJumbo);
   }
 
   @Override
   public boolean isConstString(String value, JumboStringMode jumboStringMode) {
-    return (instruction instanceof ConstString
-            && ((ConstString) instruction).BBBB.toSourceString().equals(value))
+    return (instruction instanceof DexConstString
+            && ((DexConstString) instruction).BBBB.toSourceString().equals(value))
         || (jumboStringMode == JumboStringMode.ALLOW
-            && instruction instanceof ConstStringJumbo
-            && ((ConstStringJumbo) instruction).BBBBBBBB.toSourceString().equals(value));
+            && instruction instanceof DexConstStringJumbo
+            && ((DexConstStringJumbo) instruction).BBBBBBBB.toSourceString().equals(value));
   }
 
   @Override
   public boolean isJumboString() {
-    return instruction instanceof ConstStringJumbo;
+    return instruction instanceof DexConstStringJumbo;
   }
 
   @Override public long getConstNumber() {
@@ -302,44 +303,44 @@
 
   @Override
   public String getConstString() {
-    if (instruction instanceof ConstString) {
-      return ((ConstString) instruction).BBBB.toSourceString();
+    if (instruction instanceof DexConstString) {
+      return ((DexConstString) instruction).BBBB.toSourceString();
     }
-    if (instruction instanceof ConstStringJumbo) {
-      return ((ConstStringJumbo) instruction).BBBBBBBB.toSourceString();
+    if (instruction instanceof DexConstStringJumbo) {
+      return ((DexConstStringJumbo) instruction).BBBBBBBB.toSourceString();
     }
     return null;
   }
 
   @Override
   public boolean isConstClass() {
-    return instruction instanceof ConstClass;
+    return instruction instanceof DexConstClass;
   }
 
   @Override
   public boolean isConstClass(String type) {
-    return isConstClass() && ((ConstClass) instruction).getType().toString().equals(type);
+    return isConstClass() && ((DexConstClass) instruction).getType().toString().equals(type);
   }
 
   @Override
   public boolean isGoto() {
 
-    return instruction instanceof Goto;
+    return instruction instanceof DexGoto;
   }
 
   @Override
   public boolean isIfNez() {
-    return instruction instanceof IfNez;
+    return instruction instanceof DexIfNez;
   }
 
   @Override
   public boolean isIfEq() {
-    return instruction instanceof IfEq;
+    return instruction instanceof DexIfEq;
   }
 
   @Override
   public boolean isIfEqz() {
-    return instruction instanceof IfEqz;
+    return instruction instanceof DexIfEqz;
   }
 
   @Override
@@ -356,73 +357,72 @@
 
   @Override
   public boolean isReturn() {
-    return instruction instanceof Return;
+    return instruction instanceof DexReturn;
   }
 
   @Override
   public boolean isReturnVoid() {
-    return instruction instanceof ReturnVoid;
+    return instruction instanceof DexReturnVoid;
   }
 
   @Override
   public boolean isReturnObject() {
-    return instruction instanceof ReturnObject;
+    return instruction instanceof DexReturnObject;
   }
 
   @Override
   public boolean isThrow() {
-    return instruction instanceof Throw;
+    return instruction instanceof DexThrow;
   }
 
   @Override
   public boolean isNewInstance() {
-    return instruction instanceof NewInstance;
+    return instruction instanceof DexNewInstance;
   }
 
   @Override
   public boolean isNewInstance(String type) {
-    return isNewInstance()
-        && ((NewInstance) instruction).getType().toString().equals(type);
+    return isNewInstance() && ((DexNewInstance) instruction).getType().toString().equals(type);
   }
 
   @Override
   public boolean isCheckCast() {
-    return instruction instanceof CheckCast;
+    return instruction instanceof DexCheckCast;
   }
 
   @Override
   public boolean isCheckCast(String type) {
-    return isCheckCast() && ((CheckCast) instruction).getType().toString().equals(type);
+    return isCheckCast() && ((DexCheckCast) instruction).getType().toString().equals(type);
   }
 
   @Override
   public boolean isInstanceOf() {
-    return instruction instanceof InstanceOf;
+    return instruction instanceof DexInstanceOf;
   }
 
   @Override
   public boolean isInstanceOf(String type) {
-    return isInstanceOf() && ((InstanceOf) instruction).getType().toString().equals(type);
+    return isInstanceOf() && ((DexInstanceOf) instruction).getType().toString().equals(type);
   }
 
   public boolean isConst4() {
-    return instruction instanceof Const4;
+    return instruction instanceof DexConst4;
   }
 
   @Override
   public boolean isIf() {
-    return instruction instanceof IfEq
-        || instruction instanceof IfEqz
-        || instruction instanceof IfGe
-        || instruction instanceof IfGez
-        || instruction instanceof IfGt
-        || instruction instanceof IfGtz
-        || instruction instanceof IfLe
-        || instruction instanceof IfLez
-        || instruction instanceof IfLt
-        || instruction instanceof IfLtz
-        || instruction instanceof IfNe
-        || instruction instanceof IfNez;
+    return instruction instanceof DexIfEq
+        || instruction instanceof DexIfEqz
+        || instruction instanceof DexIfGe
+        || instruction instanceof DexIfGez
+        || instruction instanceof DexIfGt
+        || instruction instanceof DexIfGtz
+        || instruction instanceof DexIfLe
+        || instruction instanceof DexIfLez
+        || instruction instanceof DexIfLt
+        || instruction instanceof DexIfLtz
+        || instruction instanceof DexIfNe
+        || instruction instanceof DexIfNez;
   }
 
   @Override
@@ -432,68 +432,68 @@
 
   @Override
   public boolean isPackedSwitch() {
-    return instruction instanceof PackedSwitch;
+    return instruction instanceof DexPackedSwitch;
   }
 
   @Override
   public boolean isSparseSwitch() {
-    return instruction instanceof SparseSwitch;
+    return instruction instanceof DexSparseSwitch;
   }
 
   @Override
   public boolean isMultiplication() {
-    return instruction instanceof MulInt
-        || instruction instanceof MulIntLit8
-        || instruction instanceof MulIntLit16
-        || instruction instanceof MulInt2Addr
-        || instruction instanceof MulFloat
-        || instruction instanceof MulFloat2Addr
-        || instruction instanceof MulLong
-        || instruction instanceof MulLong2Addr
-        || instruction instanceof MulDouble
-        || instruction instanceof MulDouble2Addr;
+    return instruction instanceof DexMulInt
+        || instruction instanceof DexMulIntLit8
+        || instruction instanceof DexMulIntLit16
+        || instruction instanceof DexMulInt2Addr
+        || instruction instanceof DexMulFloat
+        || instruction instanceof DexMulFloat2Addr
+        || instruction instanceof DexMulLong
+        || instruction instanceof DexMulLong2Addr
+        || instruction instanceof DexMulDouble
+        || instruction instanceof DexMulDouble2Addr;
   }
 
   @Override
   public boolean isNewArray() {
-    return instruction instanceof NewArray;
+    return instruction instanceof DexNewArray;
   }
 
   @Override
   public boolean isArrayLength() {
-    return instruction instanceof ArrayLength;
+    return instruction instanceof DexArrayLength;
   }
 
   @Override
   public boolean isArrayGet() {
-    return instruction instanceof Aget
-        || instruction instanceof AgetBoolean
-        || instruction instanceof AgetByte
-        || instruction instanceof AgetChar
-        || instruction instanceof AgetObject
-        || instruction instanceof AgetShort
-        || instruction instanceof AgetWide;
+    return instruction instanceof DexAget
+        || instruction instanceof DexAgetBoolean
+        || instruction instanceof DexAgetByte
+        || instruction instanceof DexAgetChar
+        || instruction instanceof DexAgetObject
+        || instruction instanceof DexAgetShort
+        || instruction instanceof DexAgetWide;
   }
 
   @Override
   public boolean isArrayPut() {
-    return instruction instanceof Aput
-        || instruction instanceof AputBoolean
-        || instruction instanceof AputByte
-        || instruction instanceof AputChar
-        || instruction instanceof AputObject
-        || instruction instanceof AputShort
-        || instruction instanceof AputWide;
+    return instruction instanceof DexAput
+        || instruction instanceof DexAputBoolean
+        || instruction instanceof DexAputByte
+        || instruction instanceof DexAputChar
+        || instruction instanceof DexAputObject
+        || instruction instanceof DexAputShort
+        || instruction instanceof DexAputWide;
   }
 
   @Override
   public boolean isMonitorEnter() {
-    return instruction instanceof MonitorEnter;
+    return instruction instanceof DexMonitorEnter;
   }
 
   @Override
   public boolean isMonitorExit() {
-    return instruction instanceof MonitorExit;
+    return instruction instanceof DexMonitorExit;
   }
 
   @Override
@@ -527,7 +527,7 @@
     return instruction.toString();
   }
 
-  public Instruction getInstruction() {
+  public DexInstruction getInstruction() {
     return instruction;
   }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java
index fcfdbbe..64880f5 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.utils.codeinspector;
 
-import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.code.DexInstruction;
 
 public class FieldAccessDexInstructionSubject extends DexInstructionSubject
     implements FieldAccessInstructionSubject {
@@ -12,7 +12,7 @@
   private final CodeInspector codeInspector;
 
   public FieldAccessDexInstructionSubject(
-      CodeInspector codeInspector, Instruction instruction, MethodSubject method) {
+      CodeInspector codeInspector, DexInstruction instruction, MethodSubject method) {
     super(instruction, method);
     this.codeInspector = codeInspector;
     assert isFieldAccess();
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 c8014e7..8a27919 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
@@ -8,7 +8,7 @@
 
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfPosition;
-import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfo;
@@ -317,7 +317,7 @@
     DexDebugPositionState state =
         new DexDebugPositionState(info.startLine, getMethod().getReference());
     Iterator<DexDebugEvent> iterator = Arrays.asList(info.events).iterator();
-    for (Instruction insn : code.instructions) {
+    for (DexInstruction insn : code.instructions) {
       int offset = insn.getOffset();
       while (state.getCurrentPc() < offset && iterator.hasNext()) {
         iterator.next().accept(state);
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java
index 7f5c6ff..5788846 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.utils.codeinspector;
 
-import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.code.DexInstruction;
 import com.android.tools.r8.graph.DexMethod;
 
 public class InvokeDexInstructionSubject extends DexInstructionSubject
@@ -13,7 +13,7 @@
   private final CodeInspector codeInspector;
 
   public InvokeDexInstructionSubject(
-      CodeInspector codeInspector, Instruction instruction, MethodSubject method) {
+      CodeInspector codeInspector, DexInstruction instruction, MethodSubject method) {
     super(instruction, method);
     this.codeInspector = codeInspector;
     assert isInvoke();
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java
index ef883fa..ff925b5 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java
@@ -4,18 +4,18 @@
 
 package com.android.tools.r8.utils.codeinspector;
 
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.NewInstance;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexNewInstance;
 import com.android.tools.r8.graph.DexType;
 
 public class NewInstanceDexInstructionSubject extends DexInstructionSubject
     implements NewInstanceInstructionSubject {
-  public NewInstanceDexInstructionSubject(Instruction instruction, MethodSubject method) {
+  public NewInstanceDexInstructionSubject(DexInstruction instruction, MethodSubject method) {
     super(instruction, method);
   }
 
   @Override
   public DexType getType() {
-    return ((NewInstance) instruction).getType();
+    return ((DexNewInstance) instruction).getType();
   }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/SwitchDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/SwitchDexInstructionSubject.java
index a49553f..6f94d8c 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/SwitchDexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/SwitchDexInstructionSubject.java
@@ -4,9 +4,9 @@
 
 package com.android.tools.r8.utils.codeinspector;
 
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.PackedSwitch;
-import com.android.tools.r8.code.SparseSwitch;
+import com.android.tools.r8.dex.code.DexInstruction;
+import com.android.tools.r8.dex.code.DexPackedSwitch;
+import com.android.tools.r8.dex.code.DexSparseSwitch;
 import com.android.tools.r8.ir.conversion.SwitchPayloadResolver;
 import it.unimi.dsi.fastutil.ints.IntArrayList;
 import java.util.List;
@@ -17,7 +17,9 @@
   private final SwitchPayloadResolver switchPayloadResolver;
 
   public SwitchDexInstructionSubject(
-      Instruction instruction, MethodSubject method, SwitchPayloadResolver switchPayloadResolver) {
+      DexInstruction instruction,
+      MethodSubject method,
+      SwitchPayloadResolver switchPayloadResolver) {
     super(instruction, method);
     assert isSwitch();
     assert instruction.isIntSwitch();
@@ -27,7 +29,7 @@
 
   @Override
   public List<Integer> getKeys() {
-    if (instruction instanceof PackedSwitch) {
+    if (instruction instanceof DexPackedSwitch) {
       assert switchPayloadResolver.getKeys(instruction.getOffset() + instruction.getPayloadOffset())
               .length
           == 1;
@@ -44,7 +46,7 @@
       }
       return keys;
     } else {
-      assert instruction instanceof SparseSwitch;
+      assert instruction instanceof DexSparseSwitch;
       return new IntArrayList(
           switchPayloadResolver.getKeys(instruction.getOffset() + instruction.getPayloadOffset()));
     }