diff --git a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/plugin/InterfacePlugin.java b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/plugin/InterfacePlugin.java
index e7eb63035..8f79983fb 100644
--- a/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/plugin/InterfacePlugin.java
+++ b/fixture-monkey-api/src/main/java/com/navercorp/fixturemonkey/api/plugin/InterfacePlugin.java
@@ -125,7 +125,8 @@ public <T> InterfacePlugin abstractClassExtends(
 		Class<T> abstractClassType,
 		List<Class<? extends T>> implementations
 	) {
-		if (!Modifier.isAbstract(abstractClassType.getModifiers())) {
+		if (!(Modifier.isAbstract(abstractClassType.getModifiers())
+			&& !Modifier.isInterface(abstractClassType.getModifiers()))) {
 			throw new IllegalArgumentException(
 				"abstractClassExtends option first parameter should be abstract class. "
 					+ abstractClassType.getTypeName()
diff --git a/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/InterfaceTestSpecs.java b/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/InterfaceTestSpecs.java
index 42f6f2d11..f0f6bab69 100644
--- a/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/InterfaceTestSpecs.java
+++ b/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/InterfaceTestSpecs.java
@@ -20,6 +20,7 @@
 
 import java.util.List;
 
+import lombok.EqualsAndHashCode;
 import lombok.Value;
 
 class InterfaceTestSpecs {
@@ -61,4 +62,14 @@ public List<InterfaceObject> getObject() {
 	public static class InterfaceWrapperObject {
 		InterfaceObject value;
 	}
+
+	abstract static class AbstractClassObject {
+		abstract Object getObject();
+	}
+
+	@EqualsAndHashCode(callSuper = true)
+	@Value
+	public static class AbstractClassStringChildObject extends AbstractClassObject {
+		String object;
+	}
 }
diff --git a/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/JavaTest.java b/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/JavaTest.java
index ffb20eef6..0b6d7c16d 100644
--- a/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/JavaTest.java
+++ b/fixture-monkey-tests/java-tests/src/test/java/com/navercorp/fixturemonkey/tests/java/JavaTest.java
@@ -32,6 +32,7 @@
 import java.time.Instant;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -92,6 +93,8 @@
 import com.navercorp.fixturemonkey.tests.java.ImmutableRecursiveTypeSpecs.SelfRecursiveListObject;
 import com.navercorp.fixturemonkey.tests.java.ImmutableRecursiveTypeSpecs.SelfRecursiveMapObject;
 import com.navercorp.fixturemonkey.tests.java.ImmutableRecursiveTypeSpecs.SelfRecursiveObject;
+import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.AbstractClassObject;
+import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.AbstractClassStringChildObject;
 import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.InterfaceIntegerObject;
 import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.InterfaceListObject;
 import com.navercorp.fixturemonkey.tests.java.InterfaceTestSpecs.InterfaceObject;
@@ -1410,4 +1413,53 @@ void constructorValidator() {
 
 		then(actual.getValue()).isEqualTo(100);
 	}
+
+	@RepeatedTest(TEST_COUNT)
+	void abstractClassExtends() {
+		FixtureMonkey sut = FixtureMonkey.builder()
+			.plugin(
+				new InterfacePlugin()
+					.abstractClassExtends(
+						AbstractClassObject.class,
+						Collections.singletonList(AbstractClassStringChildObject.class))
+			)
+			.objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
+			.build();
+
+		AbstractClassObject actual = sut.giveMeOne(AbstractClassObject.class);
+
+		then(actual).isExactlyInstanceOf(AbstractClassStringChildObject.class);
+	}
+
+	@Test
+	void abstractExtendsInterfaceThrows() {
+		thenThrownBy(
+			() -> FixtureMonkey.builder()
+				.plugin(
+					new InterfacePlugin()
+						.abstractClassExtends(
+							InterfaceObject.class,
+							Collections.singletonList(InterfaceStringObject.class))
+				)
+				.build()
+		)
+			.isExactlyInstanceOf(IllegalArgumentException.class)
+			.hasMessageContaining("should be abstract class");
+	}
+
+	@Test
+	void interfaceImplementsAbstractClassThrows() {
+		thenThrownBy(
+			() -> FixtureMonkey.builder()
+				.plugin(
+					new InterfacePlugin()
+						.interfaceImplements(
+							AbstractClassObject.class,
+							Collections.singletonList(AbstractClassStringChildObject.class))
+				)
+				.build()
+		)
+			.isExactlyInstanceOf(IllegalArgumentException.class)
+			.hasMessageContaining("should be interface");
+	}
 }