diff --git a/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt b/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt
index 94ac90b4b451b459a0448bc71b2f1c9fa652304c..481aae827fde73dc209788b13f03296259e3b00a 100644
--- a/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt
+++ b/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt
@@ -114,6 +114,9 @@ class CompatibilityCheck(
                     return
                 }
                 val name = AnnotationItem.simpleName(oldNullnessAnnotation)
+                if (old.type()?.primitive == true) {
+                    return
+                }
                 report(
                     Errors.INVALID_NULL_CONVERSION, new,
                     "Attempted to remove $name annotation from ${describe(new)}"
diff --git a/src/main/java/com/android/tools/metalava/model/ClassItem.kt b/src/main/java/com/android/tools/metalava/model/ClassItem.kt
index 7dc221b37a2f718ce5bf7df0c8ea7d37b95b5066..0d072fa6103a9faaf16cf3bc35319c1f7f368eff 100644
--- a/src/main/java/com/android/tools/metalava/model/ClassItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/ClassItem.kt
@@ -198,6 +198,8 @@ interface ClassItem : Item {
     /** Gets the type for this class */
     fun toType(): TypeItem
 
+    override fun type(): TypeItem? = null
+
     /** Returns true if this class has type parameters */
     fun hasTypeVariables(): Boolean
 
diff --git a/src/main/java/com/android/tools/metalava/model/FieldItem.kt b/src/main/java/com/android/tools/metalava/model/FieldItem.kt
index 92e49ddf7908b50c01f5829b77dda4901652f823..e65bda9ed2b914668fc1e60f8c1409c5b939982e 100644
--- a/src/main/java/com/android/tools/metalava/model/FieldItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/FieldItem.kt
@@ -23,7 +23,7 @@ import java.io.PrintWriter
 
 interface FieldItem : MemberItem {
     /** The type of this field */
-    fun type(): TypeItem
+    override fun type(): TypeItem
 
     /**
      * The initial/constant value, if any. If [requireConstant] the initial value will
diff --git a/src/main/java/com/android/tools/metalava/model/Item.kt b/src/main/java/com/android/tools/metalava/model/Item.kt
index 9fbc546a6505b93336eaa1fe4d6739f8c01dbbd0..af2042dcec78ecfdd46419fb9adbe9b2d396a61f 100644
--- a/src/main/java/com/android/tools/metalava/model/Item.kt
+++ b/src/main/java/com/android/tools/metalava/model/Item.kt
@@ -210,6 +210,13 @@ interface Item {
      */
     fun containingClass(strict: Boolean = true): ClassItem?
 
+    /**
+     * Returns the associated type if any. For example, for a field, property or parameter,
+     * this is the type of the variable; for a method, it's the return type.
+     * For packages, classes and compilation units, it's null.
+     */
+    fun type(): TypeItem?
+
     companion object {
         fun describe(item: Item, capitalize: Boolean = false): String {
             return when (item) {
diff --git a/src/main/java/com/android/tools/metalava/model/MethodItem.kt b/src/main/java/com/android/tools/metalava/model/MethodItem.kt
index bdb3b899ad7cdcde416caa580c921bf0903201ca..e27b682217cfb5688987db9f477949db2f8cf4b2 100644
--- a/src/main/java/com/android/tools/metalava/model/MethodItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/MethodItem.kt
@@ -39,6 +39,8 @@ interface MethodItem : MemberItem {
     /** Returns the super methods that this method is overriding */
     fun superMethods(): List<MethodItem>
 
+    override fun type(): TypeItem? = returnType()
+
     /**
      * Like [internalName] but is the desc-portion of the internal signature,
      * e.g. for the method "void create(int x, int y)" the internal name of
diff --git a/src/main/java/com/android/tools/metalava/model/PackageItem.kt b/src/main/java/com/android/tools/metalava/model/PackageItem.kt
index 970d2eb7416f4f71cedccc022e146dd047d38214..711c0d9fd9c92e1290bd36e0cc10d15295007507 100644
--- a/src/main/java/com/android/tools/metalava/model/PackageItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/PackageItem.kt
@@ -33,6 +33,8 @@ interface PackageItem : Item {
         return topLevelClasses().asSequence().flatMap { it.allClasses() }
     }
 
+    override fun type(): TypeItem? = null
+
     val isDefault get() = qualifiedName().isEmpty()
 
     override fun parent(): PackageItem? = if (qualifiedName().isEmpty()) null else containingPackage()
diff --git a/src/main/java/com/android/tools/metalava/model/ParameterItem.kt b/src/main/java/com/android/tools/metalava/model/ParameterItem.kt
index 3610d51685185d5383f2b21522b8e60e8da907d6..a7194e6317c35689dcc102f2551faa8b1b58b0b6 100644
--- a/src/main/java/com/android/tools/metalava/model/ParameterItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/ParameterItem.kt
@@ -24,7 +24,7 @@ interface ParameterItem : Item {
     fun name(): String
 
     /** The type of this field */
-    fun type(): TypeItem
+    override fun type(): TypeItem
 
     /** The containing method */
     fun containingMethod(): MethodItem
diff --git a/src/main/java/com/android/tools/metalava/model/PropertyItem.kt b/src/main/java/com/android/tools/metalava/model/PropertyItem.kt
index f82708c54c7172a1b0ad100970ac30ac917cf5d8..5f8478a2a6feb7048960ea0e0f13974d85d528db 100644
--- a/src/main/java/com/android/tools/metalava/model/PropertyItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/PropertyItem.kt
@@ -21,7 +21,7 @@ import com.android.tools.metalava.model.visitors.TypeVisitor
 
 interface PropertyItem : MemberItem {
     /** The type of this property */
-    fun type(): TypeItem
+    override fun type(): TypeItem
 
     override fun accept(visitor: ItemVisitor) {
         if (visitor.skip(this)) {
diff --git a/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt b/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
index 864429d2a394fba42b2bd1459fd9f412cb588a52..e7b30ebb8bbdd90e3801bd744a7e6005c74a6138 100644
--- a/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
+++ b/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
@@ -149,6 +149,11 @@ CompatibilityCheckTest : DriverTest() {
                     method @NonNull public Double convert4(@NonNull Float);
                     method @Nullable public Double convert5(@Nullable Float);
                     method @NonNull public Double convert6(@NonNull Float);
+                    // booleans cannot reasonably be annotated with @Nullable/@NonNull but
+                    // the compiler accepts it and we had a few of these accidentally annotated
+                    // that way in API 28, such as Boolean.getBoolean. Make sure we don't flag
+                    // these as incompatible changes when they're dropped.
+                    method public void convert7(@NonNull boolean);
                   }
                 }
                 """,
@@ -162,6 +167,7 @@ CompatibilityCheckTest : DriverTest() {
                     method public Double convert4(Float);
                     method @NonNull public Double convert5(@NonNull Float);
                     method @Nullable public Double convert6(@Nullable Float);
+                    method public void convert7(boolean);
                   }
                 }
                 """