diff --git a/base/pike/test/inputs/json/samples/kitchen-sink.json/default/TopLevel.pmod b/head/pike/test/inputs/json/samples/kitchen-sink.json/default/TopLevel.pmod
index 4447b66..d7fe2b2 100644
--- a/base/pike/test/inputs/json/samples/kitchen-sink.json/default/TopLevel.pmod
+++ b/head/pike/test/inputs/json/samples/kitchen-sink.json/default/TopLevel.pmod
@@ -58,9 +58,11 @@ TopLevel TopLevel_from_JSON(mixed json) {
     retval.different_things = json["differentThings"];
     retval.double_value = (float)json["doubleValue"];
     retval.int_value = json["intValue"];
+    foreach (json["mapValue"]; mixed _; mixed value) if (stringp(value)) error("Unexpected string");
     retval.map_value = json["mapValue"];
     retval.name_with_spaces = json["name with spaces"];
     retval.null_value = json["nullValue"];
+    foreach (json["nullableMapValue"]; mixed _; mixed value) if (stringp(value)) error("Unexpected string");
     retval.nullable_map_value = json["nullableMapValue"];
     retval.people = json["people"];
     retval.person = json["person"];
diff --git a/head/schema-kotlin/test/inputs/schema/class-with-additional.schema/default/TopLevel.kt b/head/schema-kotlin/test/inputs/schema/class-with-additional.schema/default/TopLevel.kt
new file mode 100644
index 0000000..f75afa4
--- /dev/null
+++ b/head/schema-kotlin/test/inputs/schema/class-with-additional.schema/default/TopLevel.kt
@@ -0,0 +1,46 @@
+// To parse the JSON, install Klaxon and do:
+//
+//   val topLevel = TopLevel.fromJson(jsonString)
+
+package quicktype
+
+import com.beust.klaxon.*
+
+private fun <T> Klaxon.convert(k: kotlin.reflect.KClass<*>, fromJson: (JsonValue) -> T, toJson: (T) -> String, isUnion: Boolean = false) =
+    this.converter(object: Converter {
+        @Suppress("UNCHECKED_CAST")
+        override fun toJson(value: Any)        = toJson(value as T)
+        override fun fromJson(jv: JsonValue)   = fromJson(jv) as Any
+        override fun canConvert(cls: Class<*>) = cls == k.java || (isUnion && cls.superclass == k.java)
+    })
+
+private val klaxon = Klaxon()
+    .convert(MapValue::class, { MapValue.fromJson(it) }, { it.toJson() }, true)
+
+data class TopLevel (
+    val map: Map<String, MapValue>? = null
+) {
+    public fun toJson() = klaxon.toJsonString(this)
+
+    companion object {
+        public fun fromJson(json: String) = klaxon.parse<TopLevel>(json)
+    }
+}
+
+sealed class MapValue {
+    class BoolValue(val value: Boolean)  : MapValue()
+    class DoubleValue(val value: Double) : MapValue()
+
+    public fun toJson(): String = klaxon.toJsonString(when (this) {
+        is BoolValue   -> this.value
+        is DoubleValue -> this.value
+    })
+
+    companion object {
+        public fun fromJson(jv: JsonValue): MapValue = when (jv.inside) {
+            is Boolean                 -> BoolValue(jv.boolean!!)
+            is Double, is Int, is Long -> DoubleValue(jv.double ?: jv.int?.toDouble() ?: jv.longValue?.toDouble()!!)
+            else                       -> throw IllegalArgumentException()
+        }
+    }
+}
diff --git a/base/schema-pike/test/inputs/schema/vega-lite.schema/default/TopLevel.pmod b/head/schema-pike/test/inputs/schema/vega-lite.schema/default/TopLevel.pmod
index 76a374d..254fefe 100644
--- a/base/schema-pike/test/inputs/schema/vega-lite.schema/default/TopLevel.pmod
+++ b/head/schema-pike/test/inputs/schema/vega-lite.schema/default/TopLevel.pmod
@@ -269,6 +269,7 @@ Config Config_from_JSON(mixed json) {
     retval.padding = json["padding"];
     retval.point = json["point"];
     retval.projection = json["projection"];
+    foreach (json["range"]; mixed _; mixed value) if (stringp(value)) error("Unexpected string");
     retval.range = json["range"];
     retval.rect = json["rect"];
     retval.rule = json["rule"];
