diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 0f4b5da..7a7a136 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -38,7 +38,10 @@ jobs:
         uses: gradle/actions/setup-gradle@v3
 
       - name: Test
-        run: ./gradlew check
+        run: |
+          # Run compileCommonMainKotlinMetadata to ensure metadata compilation works too, as it's
+          # not covered under the normal check command
+          ./gradlew check compileCommonMainKotlinMetadata
 
       - name: Publish (default branch only)
         if: github.repository == 'slackhq/EitherNet' && github.ref == 'refs/heads/main'
diff --git a/eithernet/src/commonMain/kotlin/com/slack/eithernet/KTypes.kt b/eithernet/src/commonMain/kotlin/com/slack/eithernet/KTypes.kt
index 63a704d..effc801 100644
--- a/eithernet/src/commonMain/kotlin/com/slack/eithernet/KTypes.kt
+++ b/eithernet/src/commonMain/kotlin/com/slack/eithernet/KTypes.kt
@@ -57,7 +57,12 @@ internal expect class KTypeImpl(
   arguments: List<KTypeProjection>,
   isMarkedNullable: Boolean,
   annotations: List<Annotation>,
-) : KType, EitherNetKType
+) : KType, EitherNetKType {
+  override val classifier: KClassifier?
+  override val arguments: List<KTypeProjection>
+  override val isMarkedNullable: Boolean
+  override val annotations: List<Annotation>
+}
 
 @InternalEitherNetApi
 public fun KType.canonicalize(): KType {
diff --git a/eithernet/src/jsMain/kotlin/com/slack/eithernet/platform.js.kt b/eithernet/src/jsMain/kotlin/com/slack/eithernet/platform.js.kt
index 879b182..c0930ba 100644
--- a/eithernet/src/jsMain/kotlin/com/slack/eithernet/platform.js.kt
+++ b/eithernet/src/jsMain/kotlin/com/slack/eithernet/platform.js.kt
@@ -28,10 +28,10 @@ internal actual val KClass<*>.qualifiedNameForComparison: String?
 
 internal actual class KTypeImpl
 actual constructor(
-  override val classifier: KClassifier?,
-  override val arguments: List<KTypeProjection>,
-  override val isMarkedNullable: Boolean,
-  override val annotations: List<Annotation>,
+  actual override val classifier: KClassifier?,
+  actual override val arguments: List<KTypeProjection>,
+  actual override val isMarkedNullable: Boolean,
+  actual override val annotations: List<Annotation>,
 ) : KType, EitherNetKType {
   private val impl = EitherNetKTypeImpl(classifier, arguments, isMarkedNullable, annotations)
 
diff --git a/eithernet/src/jvmMain/kotlin/com/slack/eithernet/platform.jvm.kt b/eithernet/src/jvmMain/kotlin/com/slack/eithernet/platform.jvm.kt
index 75cb31b..43c5e77 100644
--- a/eithernet/src/jvmMain/kotlin/com/slack/eithernet/platform.jvm.kt
+++ b/eithernet/src/jvmMain/kotlin/com/slack/eithernet/platform.jvm.kt
@@ -25,10 +25,10 @@ internal actual val KClass<*>.qualifiedNameForComparison: String?
 
 internal actual class KTypeImpl
 actual constructor(
-  override val classifier: KClassifier?,
-  override val arguments: List<KTypeProjection>,
-  override val isMarkedNullable: Boolean,
-  override val annotations: List<Annotation>,
+  actual override val classifier: KClassifier?,
+  actual override val arguments: List<KTypeProjection>,
+  actual override val isMarkedNullable: Boolean,
+  actual override val annotations: List<Annotation>,
 ) : KType, EitherNetKType {
   private val impl = EitherNetKTypeImpl(classifier, arguments, isMarkedNullable, annotations)
 
diff --git a/eithernet/src/nativeMain/kotlin/com/slack/eithernet/platform.native.kt b/eithernet/src/nativeMain/kotlin/com/slack/eithernet/platform.native.kt
index 75cb31b..43c5e77 100644
--- a/eithernet/src/nativeMain/kotlin/com/slack/eithernet/platform.native.kt
+++ b/eithernet/src/nativeMain/kotlin/com/slack/eithernet/platform.native.kt
@@ -25,10 +25,10 @@ internal actual val KClass<*>.qualifiedNameForComparison: String?
 
 internal actual class KTypeImpl
 actual constructor(
-  override val classifier: KClassifier?,
-  override val arguments: List<KTypeProjection>,
-  override val isMarkedNullable: Boolean,
-  override val annotations: List<Annotation>,
+  actual override val classifier: KClassifier?,
+  actual override val arguments: List<KTypeProjection>,
+  actual override val isMarkedNullable: Boolean,
+  actual override val annotations: List<Annotation>,
 ) : KType, EitherNetKType {
   private val impl = EitherNetKTypeImpl(classifier, arguments, isMarkedNullable, annotations)
 
diff --git a/eithernet/src/wasmJsMain/kotlin/com/slack/eithernet/platform.wasmJs.kt b/eithernet/src/wasmJsMain/kotlin/com/slack/eithernet/platform.wasmJs.kt
index 879b182..c0930ba 100644
--- a/eithernet/src/wasmJsMain/kotlin/com/slack/eithernet/platform.wasmJs.kt
+++ b/eithernet/src/wasmJsMain/kotlin/com/slack/eithernet/platform.wasmJs.kt
@@ -28,10 +28,10 @@ internal actual val KClass<*>.qualifiedNameForComparison: String?
 
 internal actual class KTypeImpl
 actual constructor(
-  override val classifier: KClassifier?,
-  override val arguments: List<KTypeProjection>,
-  override val isMarkedNullable: Boolean,
-  override val annotations: List<Annotation>,
+  actual override val classifier: KClassifier?,
+  actual override val arguments: List<KTypeProjection>,
+  actual override val isMarkedNullable: Boolean,
+  actual override val annotations: List<Annotation>,
 ) : KType, EitherNetKType {
   private val impl = EitherNetKTypeImpl(classifier, arguments, isMarkedNullable, annotations)