diff --git a/cglib-integration-test/pom.xml b/cglib-integration-test/pom.xml
index daf3eb6..1c71747 100644
--- a/cglib-integration-test/pom.xml
+++ b/cglib-integration-test/pom.xml
@@ -9,7 +9,7 @@
     <parent>
         <groupId>cglib</groupId>
         <artifactId>cglib-parent</artifactId>
-        <version>3.2.12</version>
+        <version>3.3.0</version>
     </parent>
 
     <!-- ====================================================================== -->
diff --git a/cglib-jmh/pom.xml b/cglib-jmh/pom.xml
index c141494..cc693c1 100644
--- a/cglib-jmh/pom.xml
+++ b/cglib-jmh/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <artifactId>cglib-parent</artifactId>
         <groupId>cglib</groupId>
-        <version>3.2.12</version>
+        <version>3.3.0</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/cglib-nodep/pom.xml b/cglib-nodep/pom.xml
index 81e63e0..e9ff647 100644
--- a/cglib-nodep/pom.xml
+++ b/cglib-nodep/pom.xml
@@ -9,7 +9,7 @@
     <parent>
         <groupId>cglib</groupId>
         <artifactId>cglib-parent</artifactId>
-        <version>3.2.12</version>
+        <version>3.3.0</version>
     </parent>
 
     <!-- ====================================================================== -->
diff --git a/cglib-sample/pom.xml b/cglib-sample/pom.xml
index bd7be09..b791713 100644
--- a/cglib-sample/pom.xml
+++ b/cglib-sample/pom.xml
@@ -9,7 +9,7 @@
     <parent>
         <groupId>cglib</groupId>
         <artifactId>cglib-parent</artifactId>
-        <version>3.2.12</version>
+        <version>3.3.0</version>
     </parent>
 
     <!-- ====================================================================== -->
diff --git a/cglib/pom.xml b/cglib/pom.xml
index 76fa20d..4563e67 100644
--- a/cglib/pom.xml
+++ b/cglib/pom.xml
@@ -9,7 +9,7 @@
     <parent>
         <groupId>cglib</groupId>
         <artifactId>cglib-parent</artifactId>
-        <version>3.2.12</version>
+        <version>3.3.0</version>
     </parent>
 
     <!-- ====================================================================== -->
diff --git a/cglib/src/main/java/net/sf/cglib/beans/BeanCopier.java b/cglib/src/main/java/net/sf/cglib/beans/BeanCopier.java
index 67b49ee..f221756 100644
--- a/cglib/src/main/java/net/sf/cglib/beans/BeanCopier.java
+++ b/cglib/src/main/java/net/sf/cglib/beans/BeanCopier.java
@@ -99,7 +99,7 @@ abstract public class BeanCopier
             Type sourceType = Type.getType(source);
             Type targetType = Type.getType(target);
             ClassEmitter ce = new ClassEmitter(v);
-            ce.begin_class(Constants.V1_2,
+            ce.begin_class(Constants.V1_8,
                            Constants.ACC_PUBLIC,
                            getClassName(),
                            BEAN_COPIER,
diff --git a/cglib/src/main/java/net/sf/cglib/beans/BeanGenerator.java b/cglib/src/main/java/net/sf/cglib/beans/BeanGenerator.java
index 6b668b7..fcfd1cd 100644
--- a/cglib/src/main/java/net/sf/cglib/beans/BeanGenerator.java
+++ b/cglib/src/main/java/net/sf/cglib/beans/BeanGenerator.java
@@ -102,7 +102,7 @@ public class BeanGenerator extends AbstractClassGenerator
             types[i] = (Type)props.get(names[i]);
         }
         ClassEmitter ce = new ClassEmitter(v);
-        ce.begin_class(Constants.V1_2,
+        ce.begin_class(Constants.V1_8,
                        Constants.ACC_PUBLIC,
                        getClassName(),
                        superclass != null ? Type.getType(superclass) : Constants.TYPE_OBJECT,
diff --git a/cglib/src/main/java/net/sf/cglib/beans/BeanMapEmitter.java b/cglib/src/main/java/net/sf/cglib/beans/BeanMapEmitter.java
index c813142..2d7b00f 100644
--- a/cglib/src/main/java/net/sf/cglib/beans/BeanMapEmitter.java
+++ b/cglib/src/main/java/net/sf/cglib/beans/BeanMapEmitter.java
@@ -45,7 +45,7 @@ class BeanMapEmitter extends ClassEmitter {
     public BeanMapEmitter(ClassVisitor v, String className, Class type, int require) {
         super(v);
 
-        begin_class(Constants.V1_2, Constants.ACC_PUBLIC, className, BEAN_MAP, null, Constants.SOURCE_FILE);
+        begin_class(Constants.V1_8, Constants.ACC_PUBLIC, className, BEAN_MAP, null, Constants.SOURCE_FILE);
         EmitUtils.null_constructor(this);
         EmitUtils.factory_method(this, NEW_INSTANCE);
         generateConstructor();
diff --git a/cglib/src/main/java/net/sf/cglib/beans/BulkBeanEmitter.java b/cglib/src/main/java/net/sf/cglib/beans/BulkBeanEmitter.java
index 2b75243..5b12a44 100644
--- a/cglib/src/main/java/net/sf/cglib/beans/BulkBeanEmitter.java
+++ b/cglib/src/main/java/net/sf/cglib/beans/BulkBeanEmitter.java
@@ -47,7 +47,7 @@ class BulkBeanEmitter extends ClassEmitter {
         Method[] setters = new Method[setterNames.length];
         validate(target, getterNames, setterNames, types, getters, setters);
 
-        begin_class(Constants.V1_2, Constants.ACC_PUBLIC, className, BULK_BEAN, null, Constants.SOURCE_FILE);
+        begin_class(Constants.V1_8, Constants.ACC_PUBLIC, className, BULK_BEAN, null, Constants.SOURCE_FILE);
         EmitUtils.null_constructor(this);
         generateGet(target, getters);
         generateSet(target, setters);
diff --git a/cglib/src/main/java/net/sf/cglib/beans/ImmutableBean.java b/cglib/src/main/java/net/sf/cglib/beans/ImmutableBean.java
index 33350ab..1df20e0 100644
--- a/cglib/src/main/java/net/sf/cglib/beans/ImmutableBean.java
+++ b/cglib/src/main/java/net/sf/cglib/beans/ImmutableBean.java
@@ -73,7 +73,7 @@ public class ImmutableBean
         public void generateClass(ClassVisitor v) {
             Type targetType = Type.getType(target);
             ClassEmitter ce = new ClassEmitter(v);
-            ce.begin_class(Constants.V1_2,
+            ce.begin_class(Constants.V1_8,
                            Constants.ACC_PUBLIC,
                            getClassName(),
                            targetType,
diff --git a/cglib/src/main/java/net/sf/cglib/core/CodeEmitter.java b/cglib/src/main/java/net/sf/cglib/core/CodeEmitter.java
index a590f59..e76a0e9 100644
--- a/cglib/src/main/java/net/sf/cglib/core/CodeEmitter.java
+++ b/cglib/src/main/java/net/sf/cglib/core/CodeEmitter.java
@@ -476,7 +476,7 @@ public class CodeEmitter extends LocalVariablesSorter {
     }
 
     public void super_invoke(Signature sig) {
-        emit_invoke(Constants.INVOKESPECIAL, ce.getSuperType(), sig);
+        emit_invoke(Constants.INVOKESPECIAL, ce.getSuperType(), sig, false);
     }
 
     public void invoke_constructor(Type type) {
@@ -491,7 +491,7 @@ public class CodeEmitter extends LocalVariablesSorter {
         invoke_constructor(ce.getClassType());
     }
 
-    private void emit_invoke(int opcode, Type type, Signature sig) {
+    private void emit_invoke(int opcode, Type type, Signature sig, boolean isInterface) {
         if (sig.getName().equals(Constants.CONSTRUCTOR_NAME) &&
             ((opcode == Constants.INVOKEVIRTUAL) ||
              (opcode == Constants.INVOKESTATIC))) {
@@ -501,19 +501,24 @@ public class CodeEmitter extends LocalVariablesSorter {
                            type.getInternalName(),
                            sig.getName(),
                            sig.getDescriptor(),
-                           opcode == Opcodes.INVOKEINTERFACE);
+                           isInterface);
     }
     
     public void invoke_interface(Type owner, Signature sig) {
-        emit_invoke(Constants.INVOKEINTERFACE, owner, sig);
+        emit_invoke(Constants.INVOKEINTERFACE, owner, sig, true);
     }
 
     public void invoke_virtual(Type owner, Signature sig) {
-        emit_invoke(Constants.INVOKEVIRTUAL, owner, sig);
+        emit_invoke(Constants.INVOKEVIRTUAL, owner, sig, false);
     }
 
+    @Deprecated
     public void invoke_static(Type owner, Signature sig) {
-        emit_invoke(Constants.INVOKESTATIC, owner, sig);
+        invoke_static(owner, sig, false);
+    }
+
+    public void invoke_static(Type owner, Signature sig, boolean isInterface) {
+        emit_invoke(Constants.INVOKESTATIC, owner, sig, isInterface);
     }
 
     public void invoke_virtual_this(Signature sig) {
@@ -525,7 +530,7 @@ public class CodeEmitter extends LocalVariablesSorter {
     }
 
     public void invoke_constructor(Type type, Signature sig) {
-        emit_invoke(Constants.INVOKESPECIAL, type, sig);
+        emit_invoke(Constants.INVOKESPECIAL, type, sig, false);
     }
 
     public void invoke_constructor_this(Signature sig) {
@@ -850,7 +855,7 @@ public class CodeEmitter extends LocalVariablesSorter {
         if (sig.getName().equals(Constants.CONSTRUCTOR_NAME)) {
             invoke_constructor(type, sig);
         } else if (TypeUtils.isStatic(method.getModifiers())) {
-            invoke_static(type, sig);
+            invoke_static(type, sig, TypeUtils.isInterface(classInfo.getModifiers()));
         } else if (TypeUtils.isInterface(classInfo.getModifiers())) {
             invoke_interface(type, sig);
         } else {
diff --git a/cglib/src/main/java/net/sf/cglib/core/KeyFactory.java b/cglib/src/main/java/net/sf/cglib/core/KeyFactory.java
index b9ea798..6fd7ca7 100644
--- a/cglib/src/main/java/net/sf/cglib/core/KeyFactory.java
+++ b/cglib/src/main/java/net/sf/cglib/core/KeyFactory.java
@@ -246,7 +246,7 @@ abstract public class KeyFactory {
             }
 
             Type[] parameterTypes = TypeUtils.getTypes(newInstance.getParameterTypes());
-            ce.begin_class(Constants.V1_2,
+            ce.begin_class(Constants.V1_8,
                            Constants.ACC_PUBLIC,
                            getClassName(),
                            KEY_FACTORY,
diff --git a/cglib/src/main/java/net/sf/cglib/proxy/Enhancer.java b/cglib/src/main/java/net/sf/cglib/proxy/Enhancer.java
index 5889323..ada39d7 100644
--- a/cglib/src/main/java/net/sf/cglib/proxy/Enhancer.java
+++ b/cglib/src/main/java/net/sf/cglib/proxy/Enhancer.java
@@ -591,7 +591,7 @@ public class Enhancer extends AbstractClassGenerator
 
         ClassEmitter e = new ClassEmitter(v);
         if (currentData == null) {
-        e.begin_class(Constants.V1_2,
+        e.begin_class(Constants.V1_8,
                       Constants.ACC_PUBLIC,
                       getClassName(),
                       Type.getType(sc),
@@ -600,7 +600,7 @@ public class Enhancer extends AbstractClassGenerator
                        TypeUtils.getTypes(interfaces)),
                       Constants.SOURCE_FILE);
         } else {
-            e.begin_class(Constants.V1_2,
+            e.begin_class(Constants.V1_8,
                     Constants.ACC_PUBLIC,
                     getClassName(),
                     null,
diff --git a/cglib/src/main/java/net/sf/cglib/proxy/InterfaceMaker.java b/cglib/src/main/java/net/sf/cglib/proxy/InterfaceMaker.java
index f4f8b71..e1f2908 100644
--- a/cglib/src/main/java/net/sf/cglib/proxy/InterfaceMaker.java
+++ b/cglib/src/main/java/net/sf/cglib/proxy/InterfaceMaker.java
@@ -100,8 +100,8 @@ public class InterfaceMaker extends AbstractClassGenerator
 
     public void generateClass(ClassVisitor v) throws Exception {
         ClassEmitter ce = new ClassEmitter(v);
-        ce.begin_class(Constants.V1_2,
-                       Constants.ACC_PUBLIC | Constants.ACC_INTERFACE,
+        ce.begin_class(Constants.V1_8,
+                       Constants.ACC_PUBLIC | Constants.ACC_INTERFACE | Constants.ACC_ABSTRACT,
                        getClassName(),
                        null,
                        null,
diff --git a/cglib/src/main/java/net/sf/cglib/proxy/MixinEmitter.java b/cglib/src/main/java/net/sf/cglib/proxy/MixinEmitter.java
index b5cfc6d..b1e387f 100644
--- a/cglib/src/main/java/net/sf/cglib/proxy/MixinEmitter.java
+++ b/cglib/src/main/java/net/sf/cglib/proxy/MixinEmitter.java
@@ -37,7 +37,7 @@ class MixinEmitter extends ClassEmitter {
     public MixinEmitter(ClassVisitor v, String className, Class[] classes, int[] route) {
         super(v);
 
-        begin_class(Constants.V1_2,
+        begin_class(Constants.V1_8,
                     Constants.ACC_PUBLIC,
                     className,
                     MIXIN,
diff --git a/cglib/src/main/java/net/sf/cglib/reflect/ConstructorDelegate.java b/cglib/src/main/java/net/sf/cglib/reflect/ConstructorDelegate.java
index ae302c6..e9f874a 100644
--- a/cglib/src/main/java/net/sf/cglib/reflect/ConstructorDelegate.java
+++ b/cglib/src/main/java/net/sf/cglib/reflect/ConstructorDelegate.java
@@ -92,7 +92,7 @@ abstract public class ConstructorDelegate {
             }
 
             ClassEmitter ce = new ClassEmitter(v);
-            ce.begin_class(Constants.V1_2,
+            ce.begin_class(Constants.V1_8,
                            Constants.ACC_PUBLIC,
                            getClassName(),
                            CONSTRUCTOR_DELEGATE,
diff --git a/cglib/src/main/java/net/sf/cglib/reflect/FastClassEmitter.java b/cglib/src/main/java/net/sf/cglib/reflect/FastClassEmitter.java
index 61990e2..d428b5a 100644
--- a/cglib/src/main/java/net/sf/cglib/reflect/FastClassEmitter.java
+++ b/cglib/src/main/java/net/sf/cglib/reflect/FastClassEmitter.java
@@ -53,7 +53,7 @@ class FastClassEmitter extends ClassEmitter {
         super(v);
 
         Type base = Type.getType(type);
-        begin_class(Constants.V1_2, Constants.ACC_PUBLIC, className, FAST_CLASS, null, Constants.SOURCE_FILE);
+        begin_class(Constants.V1_8, Constants.ACC_PUBLIC, className, FAST_CLASS, null, Constants.SOURCE_FILE);
 
         // constructor
         CodeEmitter e = begin_method(Constants.ACC_PUBLIC, CSTRUCT_CLASS, null);
diff --git a/cglib/src/main/java/net/sf/cglib/reflect/MethodDelegate.java b/cglib/src/main/java/net/sf/cglib/reflect/MethodDelegate.java
index 54da1d3..e7de82b 100644
--- a/cglib/src/main/java/net/sf/cglib/reflect/MethodDelegate.java
+++ b/cglib/src/main/java/net/sf/cglib/reflect/MethodDelegate.java
@@ -218,7 +218,7 @@ abstract public class MethodDelegate {
 
             ClassEmitter ce = new ClassEmitter(v);
             CodeEmitter e;
-            ce.begin_class(Constants.V1_2,
+            ce.begin_class(Constants.V1_8,
                            Constants.ACC_PUBLIC,
                            getClassName(),
                            METHOD_DELEGATE,
diff --git a/cglib/src/main/java/net/sf/cglib/reflect/MulticastDelegate.java b/cglib/src/main/java/net/sf/cglib/reflect/MulticastDelegate.java
index fe5e7b8..6eb0d06 100644
--- a/cglib/src/main/java/net/sf/cglib/reflect/MulticastDelegate.java
+++ b/cglib/src/main/java/net/sf/cglib/reflect/MulticastDelegate.java
@@ -102,7 +102,7 @@ abstract public class MulticastDelegate implements Cloneable {
             final MethodInfo method = ReflectUtils.getMethodInfo(ReflectUtils.findInterfaceMethod(iface));
 
             ClassEmitter ce = new ClassEmitter(cv);
-            ce.begin_class(Constants.V1_2,
+            ce.begin_class(Constants.V1_8,
                            Constants.ACC_PUBLIC,
                            getClassName(),
                            MULTICAST_DELEGATE,
diff --git a/cglib/src/main/java/net/sf/cglib/util/ParallelSorterEmitter.java b/cglib/src/main/java/net/sf/cglib/util/ParallelSorterEmitter.java
index 06351a9..47ffad1 100644
--- a/cglib/src/main/java/net/sf/cglib/util/ParallelSorterEmitter.java
+++ b/cglib/src/main/java/net/sf/cglib/util/ParallelSorterEmitter.java
@@ -33,7 +33,7 @@ class ParallelSorterEmitter extends ClassEmitter {
 
     public ParallelSorterEmitter(ClassVisitor v, String className, Object[] arrays) {
         super(v);
-        begin_class(Constants.V1_2, Constants.ACC_PUBLIC, className, PARALLEL_SORTER, null, Constants.SOURCE_FILE);
+        begin_class(Constants.V1_8, Constants.ACC_PUBLIC, className, PARALLEL_SORTER, null, Constants.SOURCE_FILE);
         EmitUtils.null_constructor(this);
         EmitUtils.factory_method(this, NEW_INSTANCE);
         generateConstructor(arrays);
diff --git a/cglib/src/main/java/net/sf/cglib/util/StringSwitcher.java b/cglib/src/main/java/net/sf/cglib/util/StringSwitcher.java
index df62488..62023e3 100644
--- a/cglib/src/main/java/net/sf/cglib/util/StringSwitcher.java
+++ b/cglib/src/main/java/net/sf/cglib/util/StringSwitcher.java
@@ -118,7 +118,7 @@ abstract public class StringSwitcher {
 
         public void generateClass(ClassVisitor v) throws Exception {
             ClassEmitter ce = new ClassEmitter(v);
-            ce.begin_class(Constants.V1_2,
+            ce.begin_class(Constants.V1_8,
                            Constants.ACC_PUBLIC,
                            getClassName(),
                            STRING_SWITCHER,
diff --git a/pom.xml b/pom.xml
index db86545..b446868 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,7 +14,7 @@
     <!-- ====================================================================== -->
     <groupId>cglib</groupId>
     <artifactId>cglib-parent</artifactId>
-    <version>3.2.12</version>
+    <version>3.3.0</version>
     <packaging>pom</packaging>
 
     <name>Code Generation Library</name>