diff --git a/src/main/java/org/sablecc/sablecc/AcceptStates.java b/src/main/java/org/sablecc/sablecc/AcceptStates.java
index d38ba438482902550af7af9231cb14e8ee6617fa..76e46e1dbb02a30d4c25352c3d2e0ea55aaa1e2a 100644
--- a/src/main/java/org/sablecc/sablecc/AcceptStates.java
+++ b/src/main/java/org/sablecc/sablecc/AcceptStates.java
@@ -27,9 +27,8 @@ public class AcceptStates extends DepthFirstAdapter
   @Override
   public void caseStart(Start node)
   {
-    for(int i = 0; i < dfa.states.size(); i++)
+    for(DFA.State state : dfa.states)
     {
-      DFA.State state = (DFA.State) dfa.states.elementAt(i);
       state.accept = -1;
 
       int accept = -1;
diff --git a/src/main/java/org/sablecc/sablecc/DFA.java b/src/main/java/org/sablecc/sablecc/DFA.java
index 4ab4bd999fd958b7a9b7aa2fe6df4766027579dc..8f8afb8ff37398365b8bb600edc94d5588ec6736 100644
--- a/src/main/java/org/sablecc/sablecc/DFA.java
+++ b/src/main/java/org/sablecc/sablecc/DFA.java
@@ -7,6 +7,7 @@
 
 package org.sablecc.sablecc;
 
+import java.util.Map;
 import java.util.Vector;
 import java.util.Hashtable;
 
@@ -20,17 +21,17 @@ public class DFA
   }
 
   public NFA nfa;
-  public final Vector states = new Vector(0);
-  public final Hashtable finder = new Hashtable(1);
+  public final Vector<DFA.State> states = new Vector<>(0);
+  public final Map<IntSet, Integer> finder = new Hashtable<>(1);
 
   private void optimize()
   {
-    Vector transitions = new Vector(0);
+    Vector<Vector<DFA.Transition>> transitions = new Vector<>(0);
 
     for(int i = 0; i < states.size(); i++)
     {
-      DFA.State state = (DFA.State) states.elementAt(i);
-      transitions.addElement(new Vector(0));
+      DFA.State state = states.elementAt(i);
+      transitions.addElement(new Vector<DFA.Transition>(0));
 
       for(int j = 0; j < state.transitions.size(); j++)
       {
@@ -50,15 +51,12 @@ public class DFA
 
         if(max < 2)
         {
-          ((Vector) transitions.elementAt(i)).addElement(
-            state.transitions.elementAt(j));
+          transitions.elementAt(i).addElement(state.transitions.elementAt(j));
         }
         else
         {
-          DFA.Transition transition1 =
-            (DFA.Transition) state.transitions.elementAt(j);
-          DFA.Transition transition2 =
-            (DFA.Transition) state.transitions.elementAt(j + max - 1);
+          DFA.Transition transition1 = state.transitions.elementAt(j);
+          DFA.Transition transition2 = state.transitions.elementAt(j + max - 1);
 
           DFA.Transition transition =
             new DFA.Transition(
@@ -67,7 +65,7 @@ public class DFA
                 transition2.interval().end),
               -2 - st);
 
-          ((Vector) transitions.elementAt(i)).addElement(transition);
+          transitions.elementAt(i).addElement(transition);
           j += max - 1;
         }
       }
@@ -75,25 +73,23 @@ public class DFA
 
     for(int i = 0; i < states.size(); i++)
     {
-      DFA.State state = (DFA.State) states.elementAt(i);
-      state.transitions = (Vector) transitions.elementAt(i);
+      DFA.State state = states.elementAt(i);
+      state.transitions = transitions.elementAt(i);
     }
   }
 
   private int match(int st1, int tr, int st2)
   {
-    DFA.State state1 = (DFA.State) states.elementAt(st1);
-    DFA.State state2 = (DFA.State) states.elementAt(st2);
+    DFA.State state1 = states.elementAt(st1);
+    DFA.State state2 = states.elementAt(st2);
 
-    DFA.Transition first =
-      (DFA.Transition) state1.transitions.elementAt(tr);
+    DFA.Transition first = state1.transitions.elementAt(tr);
 
     int j = -1;
 
     for(int i = 0; i < state2.transitions.size(); i++)
     {
-      DFA.Transition transition =
-        (DFA.Transition) state2.transitions.elementAt(i);
+      DFA.Transition transition = state2.transitions.elementAt(i);
 
       if(transition.match(first))
       {
@@ -113,11 +109,9 @@ public class DFA
     while((i < state1.transitions.size()) &&
           (j < state2.transitions.size()))
     {
-      DFA.Transition transition1 =
-        (DFA.Transition) state1.transitions.elementAt(i);
+      DFA.Transition transition1 = state1.transitions.elementAt(i);
 
-      DFA.Transition transition2 =
-        (DFA.Transition) state2.transitions.elementAt(j);
+      DFA.Transition transition2 = state2.transitions.elementAt(j);
 
       if(!transition1.match(transition2))
       {
@@ -148,7 +142,7 @@ public class DFA
     {
       System.out.print(".");
 
-      state = (State) states.elementAt(i);
+      state = states.elementAt(i);
 
       CharSet.Interval interval = new CharSet.Interval((char) 0, (char) 0xffff);
 
@@ -217,7 +211,7 @@ public class DFA
         if(modified)
         {
           destination = eclosure(destination);
-          Integer dest = (Integer) finder.get(destination);
+          Integer dest = finder.get(destination);
 
           if(dest != null)
           {
@@ -336,7 +330,7 @@ public class DFA
     }
 
     public IntSet nfaStates = new IntSet();
-    public Vector transitions = new Vector(0);
+    public Vector<Transition> transitions = new Vector<>(0);
     public int accept;
 
     @Override
@@ -355,9 +349,9 @@ public class DFA
                       }
                   }*/
 
-      for(int i = 0; i < transitions.size(); i++)
+      for(DFA.Transition transition : transitions)
       {
-        result.append(transitions.elementAt(i) + ",");
+        result.append(transition + ",");
       }
 
       return result /*+ " " + nfaStates*/ + "";
diff --git a/src/main/java/org/sablecc/sablecc/GenLexer.java b/src/main/java/org/sablecc/sablecc/GenLexer.java
index c72a0b4ce5224c9dadc1227f585f92992d0462e3..f0a29bac5b797d5be59b110f96cef816d446bf17 100644
--- a/src/main/java/org/sablecc/sablecc/GenLexer.java
+++ b/src/main/java/org/sablecc/sablecc/GenLexer.java
@@ -229,18 +229,14 @@ public class GenLexer extends AnalysisAdapter
         file.write("        { // " + acceptStatesArray[accSt].stateName + System.getProperty("line.separator"));
         Vector outerArray = new Vector();
 
-        for(int i = 0; i < dfa.states.size(); i++)
+        for(DFA.State state : dfa.states)
         {
           Vector innerArray = new Vector();
 
-          DFA.State state = (DFA.State) dfa.states.elementAt(i);
           file.write("            {");
 
-          for(int j = 0; j < state.transitions.size(); j++)
+          for(DFA.Transition transition : state.transitions)
           {
-            DFA.Transition transition =
-              (DFA.Transition) state.transitions.elementAt(j);
-
             file.write("{" + ((int) transition.interval().start) + ", " +
                        ((int) transition.interval().end) + ", " +
                        transition.destination + "}, ");
@@ -288,10 +284,8 @@ public class GenLexer extends AnalysisAdapter
         file.write("        // " + acceptStatesArray[i].stateName + System.getProperty("line.separator"));
         file.write("        {");
 
-        for(int j = 0; j < dfa.states.size(); j++)
+        for(DFA.State state : dfa.states)
         {
-          DFA.State state = (DFA.State) dfa.states.elementAt(j);
-
           file.write(state.accept + ", ");
           innerArray.addElement(state.accept);
         }