diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
index 198ffe2..a818873 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
@@ -7,6 +7,7 @@
 import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_3_72;
 import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_5_0;
 import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_6_0;
+import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_9_21;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsentIf;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
@@ -14,7 +15,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
-import com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion;
 import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.cf.code.CfInstruction;
@@ -210,7 +210,7 @@
                                     kotlinParameters
                                         .getCompiler()
                                         .getCompilerVersion()
-                                        .isEqualTo(KotlinCompilerVersion.KOTLINC_1_9_21),
+                                        .isGreaterThanOrEqualTo(KOTLINC_1_9_21),
                                     i ->
                                         i.assertIsCompleteMergeGroup(
                                             SyntheticItemsTestUtils.syntheticLambdaClass(mainKt, 0),
diff --git a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingKeepAttributesKotlinStyleTest.java b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingKeepAttributesKotlinStyleTest.java
index 2fa8198..a02782e 100644
--- a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingKeepAttributesKotlinStyleTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingKeepAttributesKotlinStyleTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.kotlin.lambda;
 
+import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_9_21;
 import static com.android.tools.r8.shaking.ProguardKeepAttributes.ENCLOSING_METHOD;
 import static com.android.tools.r8.shaking.ProguardKeepAttributes.INNER_CLASSES;
 import static com.android.tools.r8.shaking.ProguardKeepAttributes.SIGNATURE;
@@ -12,7 +13,6 @@
 import static org.junit.Assume.assumeFalse;
 import static org.junit.Assume.assumeTrue;
 
-import com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion;
 import com.android.tools.r8.KotlinTestBase;
 import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
@@ -233,7 +233,7 @@
                 SyntheticItemsTestUtils.syntheticLambdaClass(mainKt, 17));
         inspector
             .applyIf(
-                kotlinc.is(KotlinCompilerVersion.KOTLINC_1_9_21)
+                kotlinc.getCompilerVersion().isGreaterThanOrEqualTo(KOTLINC_1_9_21)
                     && parameters.isDexRuntime()
                     && lambdaGeneration.isInvokeDynamic(),
                 i ->
diff --git a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingSingletonTest.java b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingSingletonTest.java
index c4c57c0..988651b 100644
--- a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingSingletonTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingSingletonTest.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.KotlinTestParameters;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -103,7 +104,9 @@
         .isLessThanOrEqualTo(KotlinCompilerVersion.KOTLINC_1_9_21)) {
       inspector.assertIsCompleteMergeGroup(lambdasInInput.getJStyleLambdas());
     } else {
-      assertEquals(4, inspector.getMergeGroups().size());
+      assertEquals(
+          parameters.isCfRuntime() || parameters.getApiLevel() == AndroidApiLevel.B ? 3 : 4,
+          inspector.getMergeGroups().size());
     }
 
     // The remaining lambdas are not merged.
diff --git a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingTrivialJavaStyleTest.java b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingTrivialJavaStyleTest.java
index 3665e88..554658a 100644
--- a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingTrivialJavaStyleTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingTrivialJavaStyleTest.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.kotlin.lambda;
 
 import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_5_0;
+import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_9_21;
 import static com.android.tools.r8.utils.PredicateUtils.not;
 import static junit.framework.TestCase.assertEquals;
 import static org.hamcrest.CoreMatchers.containsString;
@@ -148,24 +149,42 @@
       }
     } else if (parameters.canUseDefaultAndStaticInterfaceMethods()) {
       inspector
-          .assertIsCompleteMergeGroup(
-              SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 0),
-              SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 1))
-          .assertIsCompleteMergeGroup(
-              SyntheticItemsTestUtils.syntheticLambdaClass(innerClassReference, 0),
-              SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 2),
-              SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 3))
-          .assertIsCompleteMergeGroup(
-              SyntheticItemsTestUtils.syntheticLambdaClass(innerClassReference, 1),
-              SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 4),
-              SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 5))
+          .applyIf(
+              kotlinc.getCompilerVersion().isLessThanOrEqualTo(KOTLINC_1_9_21),
+              i -> {
+                i.assertIsCompleteMergeGroup(
+                        SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 0),
+                        SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 1))
+                    .assertIsCompleteMergeGroup(
+                        SyntheticItemsTestUtils.syntheticLambdaClass(innerClassReference, 0),
+                        SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 2),
+                        SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 3))
+                    .assertIsCompleteMergeGroup(
+                        SyntheticItemsTestUtils.syntheticLambdaClass(innerClassReference, 1),
+                        SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 4),
+                        SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 5));
+                for (int id = 6; id < 30; id++) {
+                  inspector.assertClassReferencesNotMerged(
+                      SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, id));
+                }
+              },
+              i -> {
+                i.assertIsCompleteMergeGroup(
+                        SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 0),
+                        SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 1),
+                        SyntheticItemsTestUtils.syntheticLambdaClass(innerClassReference, 0))
+                    .assertIsCompleteMergeGroup(
+                        SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 2),
+                        SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, 3),
+                        SyntheticItemsTestUtils.syntheticLambdaClass(innerClassReference, 1));
+                for (int id = 4; id < 30; id++) {
+                  inspector.assertClassReferencesNotMerged(
+                      SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, id));
+                }
+              })
           .assertClassReferencesNotMerged(
               SyntheticItemsTestUtils.syntheticLambdaClass(innerClassReference, 2),
               SyntheticItemsTestUtils.syntheticLambdaClass(innerClassReference, 3));
-      for (int id = 6; id < 30; id++) {
-        inspector.assertClassReferencesNotMerged(
-            SyntheticItemsTestUtils.syntheticLambdaClass(mainClassReference, id));
-      }
     } else {
       inspector
           .assertIsCompleteMergeGroup(
