diff --git a/api/current.txt b/api/current.txt
index 9bdcdad..5df52b9 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -37692,11 +37692,8 @@
     field public static final android.os.Parcelable.Creator<android.service.autofill.EditDistanceScorer> CREATOR;
   }
 
-  public final class FieldClassification implements android.os.Parcelable {
-    method public int describeContents();
+  public final class FieldClassification {
     method public java.util.List<android.service.autofill.FieldClassification.Match> getMatches();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.service.autofill.FieldClassification> CREATOR;
   }
 
   public static final class FieldClassification.Match {
diff --git a/core/java/android/service/autofill/FieldClassification.java b/core/java/android/service/autofill/FieldClassification.java
index 001e3a0..001b291 100644
--- a/core/java/android/service/autofill/FieldClassification.java
+++ b/core/java/android/service/autofill/FieldClassification.java
@@ -20,7 +20,6 @@
 
 import android.annotation.NonNull;
 import android.os.Parcel;
-import android.os.Parcelable;
 import android.view.autofill.Helper;
 
 import com.android.internal.util.Preconditions;
@@ -34,8 +33,7 @@
  * Represents the <a href="AutofillService.html#FieldClassification">field classification</a>
  * results for a given field.
  */
-// TODO(b/70291841): let caller handle Parcelable...
-public final class FieldClassification implements Parcelable {
+public final class FieldClassification {
 
     private final ArrayList<Match> mMatches;
 
@@ -72,42 +70,38 @@
         return "FieldClassification: " + mMatches;
     }
 
-    /////////////////////////////////////
-    // Parcelable "contract" methods. //
-    /////////////////////////////////////
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel parcel, int flags) {
+    private void writeToParcel(Parcel parcel) {
         parcel.writeInt(mMatches.size());
         for (int i = 0; i < mMatches.size(); i++) {
             mMatches.get(i).writeToParcel(parcel);
         }
     }
 
-    public static final Parcelable.Creator<FieldClassification> CREATOR =
-            new Parcelable.Creator<FieldClassification>() {
-
-        @Override
-        public FieldClassification createFromParcel(Parcel parcel) {
-            final int size = parcel.readInt();
-            final ArrayList<Match> matches = new ArrayList<>();
-            for (int i = 0; i < size; i++) {
-                matches.add(i, Match.readFromParcel(parcel));
-            }
-
-            return new FieldClassification(matches);
+    private static FieldClassification readFromParcel(Parcel parcel) {
+        final int size = parcel.readInt();
+        final ArrayList<Match> matches = new ArrayList<>();
+        for (int i = 0; i < size; i++) {
+            matches.add(i, Match.readFromParcel(parcel));
         }
 
-        @Override
-        public FieldClassification[] newArray(int size) {
-            return new FieldClassification[size];
+        return new FieldClassification(matches);
+    }
+
+    static FieldClassification[] readArrayFromParcel(Parcel parcel) {
+        final int length = parcel.readInt();
+        final FieldClassification[] fcs = new FieldClassification[length];
+        for (int i = 0; i < length; i++) {
+            fcs[i] = readFromParcel(parcel);
         }
-    };
+        return fcs;
+    }
+
+    static void writeArrayToParcel(@NonNull Parcel parcel, @NonNull FieldClassification[] fcs) {
+        parcel.writeInt(fcs.length);
+        for (int i = 0; i < fcs.length; i++) {
+            fcs[i].writeToParcel(parcel);
+        }
+    }
 
     /**
      * Represents the score of a {@link UserData} entry for the field.
@@ -170,23 +164,5 @@
         private static Match readFromParcel(@NonNull Parcel parcel) {
             return new Match(parcel.readString(), parcel.readFloat());
         }
-
-        /** @hide */
-        public static Match[] readArrayFromParcel(@NonNull Parcel parcel) {
-            final int length = parcel.readInt();
-            final Match[] matches = new Match[length];
-            for (int i = 0; i < length; i++) {
-                matches[i] = readFromParcel(parcel);
-            }
-            return matches;
-        }
-
-        /** @hide */
-        public static void writeArrayToParcel(@NonNull Parcel parcel, @NonNull Match[] matches) {
-            parcel.writeInt(matches.length);
-            for (int i = 0; i < matches.length; i++) {
-                matches[i].writeToParcel(parcel);
-            }
-        }
     }
 }
diff --git a/core/java/android/service/autofill/FillEventHistory.java b/core/java/android/service/autofill/FillEventHistory.java
index 2eb44cf..df62446 100644
--- a/core/java/android/service/autofill/FillEventHistory.java
+++ b/core/java/android/service/autofill/FillEventHistory.java
@@ -156,7 +156,8 @@
                 final AutofillId[] detectedFields = event.mDetectedFieldIds;
                 parcel.writeParcelableArray(detectedFields, flags);
                 if (detectedFields != null) {
-                    parcel.writeParcelableArray(event.mDetectedFieldClassifications, flags);
+                    FieldClassification.writeArrayToParcel(parcel,
+                            event.mDetectedFieldClassifications);
                 }
             }
         }
@@ -551,7 +552,7 @@
                                 AutofillId.class);
                         final FieldClassification[] detectedFieldClassifications =
                                 (detectedFieldIds != null)
-                                ? parcel.readParcelableArray(null, FieldClassification.class)
+                                ? FieldClassification.readArrayFromParcel(parcel)
                                 : null;
 
                         selection.addEvent(new Event(eventType, datasetId, clientState,
