diff --git a/android_icu4j/api/public/current.txt b/android_icu4j/api/public/current.txt
index fd2e6fe..ee59067 100644
--- a/android_icu4j/api/public/current.txt
+++ b/android_icu4j/api/public/current.txt
@@ -1715,6 +1715,7 @@
     method public CharSequence subSequence(int, int);
     method public java.math.BigDecimal toBigDecimal();
     method public java.text.AttributedCharacterIterator toCharacterIterator();
+    method public String toString();
   }
 
   public class FormattedNumberRange implements android.icu.text.FormattedValue {
@@ -1727,6 +1728,7 @@
     method public boolean nextPosition(android.icu.text.ConstrainedFieldPosition);
     method public CharSequence subSequence(int, int);
     method public java.text.AttributedCharacterIterator toCharacterIterator();
+    method public String toString();
   }
 
   public abstract class FractionPrecision extends android.icu.number.Precision {
@@ -2199,6 +2201,7 @@
     method public android.icu.text.Collator cloneAsThawed();
     method public abstract int compare(String, String);
     method public int compare(Object, Object);
+    method public boolean equals(Object);
     method public boolean equals(String, String);
     method public android.icu.text.Collator freeze();
     method public static java.util.Locale[] getAvailableLocales();
@@ -2576,6 +2579,7 @@
     method public boolean nextPosition(android.icu.text.ConstrainedFieldPosition);
     method public CharSequence subSequence(int, int);
     method public java.text.AttributedCharacterIterator toCharacterIterator();
+    method public String toString();
   }
 
   public class DateIntervalInfo implements java.lang.Cloneable android.icu.util.Freezable<android.icu.text.DateIntervalInfo> java.io.Serializable {
@@ -2947,6 +2951,7 @@
     method public boolean nextPosition(android.icu.text.ConstrainedFieldPosition);
     method public CharSequence subSequence(int, int);
     method public java.text.AttributedCharacterIterator toCharacterIterator();
+    method public String toString();
   }
 
   public enum ListFormatter.Type {
@@ -3412,6 +3417,7 @@
     method public boolean nextPosition(android.icu.text.ConstrainedFieldPosition);
     method public CharSequence subSequence(int, int);
     method public java.text.AttributedCharacterIterator toCharacterIterator();
+    method public String toString();
   }
 
   public enum RelativeDateTimeFormatter.RelativeDateTimeUnit {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/ULocaleCollationTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/ULocaleCollationTest.java
index 4416bb1..3e78ea1 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/ULocaleCollationTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/ULocaleCollationTest.java
@@ -314,17 +314,18 @@
                 expected.add(new UiListItem(new ULocale(rawRow[2]), new ULocale(rawRow[3]), rawRow[0], rawRow[1]));
             }
             List<UiListItem> newList = names.getUiList(list, false, collator);
-            if (!expected.equals(newList)) {
-                if (expected.size() != newList.size()) {
-                    errln(list.toString() + ": wrong size" + expected + ", " + newList);
-                } else {
-                    errln(list.toString());
-                    for (int i = 0; i < expected.size(); ++i) {
-                        assertEquals(i+"", expected.get(i), newList.get(i));
-                    }
-                }
+            // Android-changed: Checking nameInSelf is not necessary.
+            if (expected.size() != newList.size()) {
+                errln(list.toString() + ": wrong size" + expected + ", " + newList);
             } else {
-                assertEquals(list.toString(), expected, newList);
+                String msgHead = list.toString() + ":";
+                for (int i = 0; i < expected.size(); ++i) {
+                    UiListItem expectedItem = expected.get(i);
+                    UiListItem newItem = newList.get(i);
+                    assertEquals(msgHead + i+":minimized", expectedItem.minimized, newItem.minimized);
+                    assertEquals(msgHead + i+":modified", expectedItem.modified, newItem.modified);
+                    assertEquals(msgHead + i+":nameInDisplayLocale", expectedItem.nameInDisplayLocale, newItem.nameInDisplayLocale);
+                }
             }
         }
     }
diff --git a/icu4c/source/test/intltest/loctest.cpp b/icu4c/source/test/intltest/loctest.cpp
index 2cf9143..ecc1bf0 100644
--- a/icu4c/source/test/intltest/loctest.cpp
+++ b/icu4c/source/test/intltest/loctest.cpp
@@ -927,8 +927,9 @@
       ;
 
     /* TODO: Change this test to be more like the cloctst version? */
-    if (testCount != 595)
-        errln("Expected getISOLanguages() to return 595 languages; it returned %d", testCount);
+    // Allow more than a min number of languages provided in AOSP
+    if (testCount < 595)
+        errln("Expected getISOLanguages() to return at least 595 languages; it returned %d", testCount);
     else {
         for (i = 0; i < 15; i++) {
             int32_t j;
diff --git a/icu4j/main/tests/collate/src/com/ibm/icu/dev/test/util/ULocaleCollationTest.java b/icu4j/main/tests/collate/src/com/ibm/icu/dev/test/util/ULocaleCollationTest.java
index 170e51c..185bb70 100644
--- a/icu4j/main/tests/collate/src/com/ibm/icu/dev/test/util/ULocaleCollationTest.java
+++ b/icu4j/main/tests/collate/src/com/ibm/icu/dev/test/util/ULocaleCollationTest.java
@@ -311,17 +311,18 @@
                 expected.add(new UiListItem(new ULocale(rawRow[2]), new ULocale(rawRow[3]), rawRow[0], rawRow[1]));
             }
             List<UiListItem> newList = names.getUiList(list, false, collator);
-            if (!expected.equals(newList)) {
-                if (expected.size() != newList.size()) {
-                    errln(list.toString() + ": wrong size" + expected + ", " + newList);
-                } else {
-                    errln(list.toString());
-                    for (int i = 0; i < expected.size(); ++i) {
-                        assertEquals(i+"", expected.get(i), newList.get(i));
-                    }
-                }
+            // Android-changed: Checking nameInSelf is not necessary.
+            if (expected.size() != newList.size()) {
+                errln(list.toString() + ": wrong size" + expected + ", " + newList);
             } else {
-                assertEquals(list.toString(), expected, newList);
+                String msgHead = list.toString() + ":";
+                for (int i = 0; i < expected.size(); ++i) {
+                    UiListItem expectedItem = expected.get(i);
+                    UiListItem newItem = newList.get(i);
+                    assertEquals(msgHead + i+":minimized", expectedItem.minimized, newItem.minimized);
+                    assertEquals(msgHead + i+":modified", expectedItem.modified, newItem.modified);
+                    assertEquals(msgHead + i+":nameInDisplayLocale", expectedItem.nameInDisplayLocale, newItem.nameInDisplayLocale);
+                }
             }
         }
     }
