--- old/src/java.base/share/classes/java/lang/invoke/AbstractValidatingLambdaMetafactory.java 2018-11-15 20:46:07.000000000 -0800 +++ new/src/java.base/share/classes/java/lang/invoke/AbstractValidatingLambdaMetafactory.java 2018-11-15 20:46:05.000000000 -0800 @@ -143,8 +143,16 @@ case REF_invokeSpecial: // JDK-8172817: should use referenced class here, but we don't know what it was this.implClass = implInfo.getDeclaringClass(); - this.implKind = REF_invokeSpecial; this.implIsInstanceMethod = true; + + // invokespecial should only be used to invoke private nestmate constructors. + // For private nestmate instance methods, it should use invokevirtual or + // invokeinterface; otherwise, the generated class may fail verification. + if (targetClass.isNestmateOf(implClass) && !implInfo.getName().equals("")) { + this.implKind = implClass.isInterface() ? REF_invokeInterface : REF_invokeVirtual; + } else { + this.implKind = REF_invokeSpecial; + } break; case REF_invokeStatic: case REF_newInvokeSpecial: