diff --git a/lib/tuple.dart b/lib/tuple.dart
index bf874e1..5321f7c 100644
--- a/lib/tuple.dart
+++ b/lib/tuple.dart
@@ -22,7 +22,6 @@
 /// ```
 library tuple;
 
-import 'package:quiver/check.dart';
 import 'package:quiver/core.dart';
 
 /// Represents a 2-tuple, or pair.
@@ -38,10 +37,10 @@
 
   /// Create a new tuple value with the specified list [items].
   factory Tuple2.fromList(List items) {
-    checkArgument(
-      identical(items?.length, 2),
-      message: 'items must have two values',
-    );
+    if (items.length != 2) {
+      throw ArgumentError('items must have length 2');
+    }
+
     return Tuple2<T1, T2>(items[0] as T1, items[1] as T2);
   }
 
@@ -67,7 +66,7 @@
 
   @override
   bool operator ==(other) =>
-      other is Tuple2<T1, T2> && other.item1 == item1 && other.item2 == item2;
+      other is Tuple2 && other.item1 == item1 && other.item2 == item2;
 
   @override
   int get hashCode => hash2(item1.hashCode, item2.hashCode);
@@ -89,8 +88,10 @@
 
   /// Create a new tuple value with the specified list [items].
   factory Tuple3.fromList(List items) {
-    checkArgument(identical(items?.length, 3),
-        message: 'items must have three values');
+    if (items.length != 3) {
+      throw ArgumentError('items must have length 3');
+    }
+
     return Tuple3<T1, T2, T3>(items[0] as T1, items[1] as T2, items[2] as T3);
   }
 
@@ -121,7 +122,7 @@
 
   @override
   bool operator ==(other) =>
-      other is Tuple3<T1, T2, T3> &&
+      other is Tuple3 &&
       other.item1 == item1 &&
       other.item2 == item2 &&
       other.item3 == item3;
@@ -149,8 +150,10 @@
 
   /// Create a new tuple value with the specified list [items].
   factory Tuple4.fromList(List items) {
-    checkArgument(identical(items?.length, 4),
-        message: 'items must have four values');
+    if (items.length != 4) {
+      throw ArgumentError('items must have length 4');
+    }
+
     return Tuple4<T1, T2, T3, T4>(
         items[0] as T1, items[1] as T2, items[2] as T3, items[3] as T4);
   }
@@ -187,7 +190,7 @@
 
   @override
   bool operator ==(other) =>
-      other is Tuple4<T1, T2, T3, T4> &&
+      other is Tuple4 &&
       other.item1 == item1 &&
       other.item2 == item2 &&
       other.item3 == item3 &&
@@ -220,10 +223,10 @@
 
   /// Create a new tuple value with the specified list [items].
   factory Tuple5.fromList(List items) {
-    checkArgument(
-      identical(items?.length, 5),
-      message: 'items must have five values',
-    );
+    if (items.length != 5) {
+      throw ArgumentError('items must have length 5');
+    }
+
     return Tuple5<T1, T2, T3, T4, T5>(items[0] as T1, items[1] as T2,
         items[2] as T3, items[3] as T4, items[4] as T5);
   }
@@ -265,7 +268,7 @@
 
   @override
   bool operator ==(other) =>
-      other is Tuple5<T1, T2, T3, T4, T5> &&
+      other is Tuple5 &&
       other.item1 == item1 &&
       other.item2 == item2 &&
       other.item3 == item3 &&
@@ -308,10 +311,10 @@
 
   /// Create a new tuple value with the specified list [items].
   factory Tuple6.fromList(List items) {
-    checkArgument(
-      identical(items?.length, 6),
-      message: 'items must have six values',
-    );
+    if (items.length != 6) {
+      throw ArgumentError('items must have length 6');
+    }
+
     return Tuple6<T1, T2, T3, T4, T5, T6>(items[0] as T1, items[1] as T2,
         items[2] as T3, items[3] as T4, items[4] as T5, items[5] as T6);
   }
@@ -358,7 +361,7 @@
 
   @override
   bool operator ==(other) =>
-      other is Tuple6<T1, T2, T3, T4, T5, T6> &&
+      other is Tuple6 &&
       other.item1 == item1 &&
       other.item2 == item2 &&
       other.item3 == item3 &&
@@ -406,10 +409,10 @@
 
   /// Create a new tuple value with the specified list [items].
   factory Tuple7.fromList(List items) {
-    checkArgument(
-      identical(items?.length, 7),
-      message: 'items must have seven values',
-    );
+    if (items.length != 7) {
+      throw ArgumentError('items must have length 7');
+    }
+
     return Tuple7<T1, T2, T3, T4, T5, T6, T7>(
         items[0] as T1,
         items[1] as T2,
@@ -476,7 +479,7 @@
 
   @override
   bool operator ==(other) =>
-      other is Tuple7<T1, T2, T3, T4, T5, T6, T7> &&
+      other is Tuple7 &&
       other.item1 == item1 &&
       other.item2 == item2 &&
       other.item3 == item3 &&
diff --git a/test/tuple_test.dart b/test/tuple_test.dart
index fc0de80..657451d 100644
--- a/test/tuple_test.dart
+++ b/test/tuple_test.dart
@@ -16,7 +16,7 @@
 
     group('\'s fromList', () {
       test('throws when items is null', () {
-        expect(() => Tuple2<int, String>.fromList(null), throwsArgumentError);
+        expect(() => Tuple2<int, String>.fromList(null), throwsA(anything));
       });
 
       test('throws when items is empty', () {
@@ -110,7 +110,7 @@
     group('\'s fromList', () {
       test('throws when items is null', () {
         expect(
-            () => Tuple3<int, String, int>.fromList(null), throwsArgumentError);
+            () => Tuple3<int, String, int>.fromList(null), throwsA(anything));
       });
 
       test('throws when items is empty', () {
@@ -222,7 +222,7 @@
     group('\'s fromList', () {
       test('throws when items is null', () {
         expect(() => Tuple4<int, String, int, String>.fromList(null),
-            throwsArgumentError);
+            throwsA(anything));
       });
 
       test('throws when items is empty', () {
@@ -360,7 +360,7 @@
     group('\'s fromList', () {
       test('throws when items is null', () {
         expect(() => Tuple5<int, String, int, String, int>.fromList(null),
-            throwsArgumentError);
+            throwsA(anything));
       });
 
       test('throws when items is empty', () {
@@ -534,7 +534,7 @@
       test('throws when items is null', () {
         expect(
             () => Tuple6<int, String, int, String, int, String>.fromList(null),
-            throwsArgumentError);
+            throwsA(anything));
       });
 
       test('throws when items is empty', () {
@@ -754,7 +754,7 @@
         expect(
             () => Tuple7<int, String, int, String, int, String, int>.fromList(
                 null),
-            throwsArgumentError);
+            throwsA(anything));
       });
 
       test('throws when items is empty', () {
