diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java
index 88403c3..728297d 100644
--- a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java
+++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileBytecodeProvider.java
@@ -138,7 +138,11 @@ public final class ClassfileBytecodeProvider implements BytecodeProvider {
         return classfile;
     }
 
-    synchronized Class<?> resolveToClass(String descriptor) {
+    Class<?> resolveToClass(String descriptor) {
+        return resolveToClass(descriptor, false);
+    }
+
+    synchronized Class<?> resolveToClass(String descriptor, boolean initialize) {
         Class<?> c = classes.get(descriptor);
         if (c == null) {
             if (descriptor.length() == 1) {
@@ -155,7 +159,7 @@ public final class ClassfileBytecodeProvider implements BytecodeProvider {
                     name = descriptor.replace('/', '.');
                 }
                 try {
-                    c = Class.forName(name, true, loader);
+                    c = Class.forName(name, initialize, loader);
                     classes.put(descriptor, c);
                 } catch (ClassNotFoundException e) {
                     throw new NoClassDefFoundError(descriptor);
diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstant.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstant.java
index 087f78b..bde2dd4 100644
--- a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstant.java
+++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstant.java
@@ -70,8 +70,9 @@ abstract class ClassfileConstant {
      * @param cp
      * @param index
      * @param opcode
+     * @param initialize
      */
-    public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode) {
+    public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode, boolean initialize) {
     }
 
     @Override
@@ -90,15 +91,19 @@ abstract class ClassfileConstant {
         }
 
         @Override
-        public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode) {
-            resolve(cp);
+        public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode, boolean initialize) {
+            resolve(cp, initialize);
         }
 
         public ResolvedJavaType resolve(ClassfileConstantPool cp) throws GraalError {
+            return resolve(cp, false /* initialize */);
+        }
+
+        public ResolvedJavaType resolve(ClassfileConstantPool cp, boolean initialize) throws GraalError {
             if (type == null) {
                 String typeDescriptor = cp.get(Utf8.class, nameIndex).value;
                 ClassfileBytecodeProvider context = cp.context;
-                type = context.metaAccess.lookupJavaType(context.resolveToClass(typeDescriptor));
+                type = context.metaAccess.lookupJavaType(context.resolveToClass(typeDescriptor, initialize));
             }
             return type;
         }
@@ -116,8 +121,8 @@ abstract class ClassfileConstant {
         }
 
         @Override
-        public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode) {
-            cp.get(ClassRef.class, classIndex).loadReferencedType(cp, classIndex, opcode);
+        public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode, boolean initialize) {
+            cp.get(ClassRef.class, classIndex).loadReferencedType(cp, classIndex, opcode, initialize);
         }
     }
 
@@ -269,7 +274,7 @@ abstract class ClassfileConstant {
         }
 
         @Override
-        public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode) {
+        public void loadReferencedType(ClassfileConstantPool cp, int index, int opcode, boolean initialize) {
             throw new GraalError("Resolution of " + name + " constant pool entries not supported by " + ClassfileBytecodeProvider.class.getSimpleName());
         }
     }
diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstantPool.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstantPool.java
index 218df10..a54779b 100644
--- a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstantPool.java
+++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/ClassfileConstantPool.java
@@ -133,11 +133,11 @@ class ClassfileConstantPool implements ConstantPool {
     }
 
     @Override
-    public void loadReferencedType(int index, int opcode) {
+    public void loadReferencedType(int index, int opcode, boolean initialize) {
         if (opcode == Bytecodes.INVOKEDYNAMIC) {
             throw new GraalError("INVOKEDYNAMIC not supported by " + ClassfileBytecodeProvider.class.getSimpleName());
         }
-        entries[index].loadReferencedType(this, index, opcode);
+        entries[index].loadReferencedType(this, index, opcode, initialize);
     }
 
     @Override
