diff --git a/cue/builtin_test.go b/cue/builtin_test.go
index 7e5d41e..57ad4a5 100644
--- a/cue/builtin_test.go
+++ b/cue/builtin_test.go
@@ -156,12 +156,6 @@
 		test("list", `list.Drop([1, 2, 3, 4], -1)`),
 		`_|_(error in call to list.Drop: negative index)`,
 	}, {
-		test("list", `list.Flatten([1, [[2, 3], []], [4]])`),
-		`[1,2,3,4]`,
-	}, {
-		test("list", `list.Flatten("foo")`),
-		`_|_(error in call to list.Flatten: cannot use value "foo" (type string) as list)`,
-	}, {
 		test("list", `list.FlattenN([1, [[2, 3], []], [4]], -1)`),
 		`[1,2,3,4]`,
 	}, {
@@ -178,7 +172,7 @@
 		`_|_(error in call to list.FlattenN: cannot use value "foo" (type string) as list)`,
 	}, {
 		test("list", `list.FlattenN([], "foo")`),
-		`_|_(cannot use "foo" (type string) as number in argument 2 to list.FlattenN)`,
+		`_|_(cannot use "foo" (type string) as int in argument 2 to list.FlattenN)`,
 	}, {
 		test("list", `list.Max([1, 2, 3, 4])`),
 		`4`,
diff --git a/cue/builtins.go b/cue/builtins.go
index ef2f823..80eec8a 100644
--- a/cue/builtins.go
+++ b/cue/builtins.go
@@ -686,46 +686,14 @@
 				}()
 			},
 		}, {
-			Name:   "Flatten",
-			Params: []kind{topKind},
-			Result: listKind,
-			Func: func(c *callCtxt) {
-				xs := c.value(0)
-				c.ret, c.err = func() (interface{}, error) {
-					var flatten func(Value) ([]Value, error)
-					flatten = func(xs Value) ([]Value, error) {
-						var res []Value
-						iter, err := xs.List()
-						if err != nil {
-							return nil, err
-						}
-						for iter.Next() {
-							val := iter.Value()
-							if val.Kind() == ListKind {
-								vals, err := flatten(val)
-								if err != nil {
-									return nil, err
-								}
-								res = append(res, vals...)
-							} else {
-								res = append(res, val)
-							}
-						}
-						return res, nil
-					}
-					return flatten(xs)
-				}()
-			},
-		}, {
 			Name:   "FlattenN",
-			Params: []kind{topKind, numKind},
+			Params: []kind{topKind, intKind},
 			Result: listKind,
 			Func: func(c *callCtxt) {
-				xs, depth := c.value(0), c.decimal(1)
+				xs, depth := c.value(0), c.int(1)
 				c.ret, c.err = func() (interface{}, error) {
-					var flattenN func(Value, *internal.Decimal) ([]Value, error)
-					one := apd.New(1, 0)
-					flattenN = func(xs Value, depth *internal.Decimal) ([]Value, error) {
+					var flattenN func(Value, int) ([]Value, error)
+					flattenN = func(xs Value, depth int) ([]Value, error) {
 						var res []Value
 						iter, err := xs.List()
 						if err != nil {
@@ -733,17 +701,13 @@
 						}
 						for iter.Next() {
 							val := iter.Value()
-							if val.Kind() == ListKind && !depth.IsZero() {
-								d := apd.New(0, 0)
-								_, err := internal.BaseContext.Sub(d, depth, one)
+							if val.Kind() == ListKind && depth != 0 {
+								d := depth - 1
+								values, err := flattenN(val, d)
 								if err != nil {
 									return nil, err
 								}
-								vals, err := flattenN(val, d)
-								if err != nil {
-									return nil, err
-								}
-								res = append(res, vals...)
+								res = append(res, values...)
 							} else {
 								res = append(res, val)
 							}
diff --git a/pkg/list/list.go b/pkg/list/list.go
index 7f37933..a069942 100644
--- a/pkg/list/list.go
+++ b/pkg/list/list.go
@@ -20,8 +20,6 @@
 	"sort"
 
 	"cuelang.org/go/cue"
-	"cuelang.org/go/internal"
-	"github.com/cockroachdb/apd/v2"
 )
 
 // Drop reports the suffix of list x after the first n elements,
@@ -47,41 +45,46 @@
 	return x[n:], nil
 }
 
-// Flatten reports a flattend sequence of the list xs by expanding any elements
-// that are lists.
+// TODO: disable Flatten until we know the right default for depth.
+//       The right time to determine is at least some point after the query
+//       extensions are introduced, which may provide flatten functionality
+//       natively.
 //
-// For instance:
-//
-//    Flatten([1, [[2, 3], []], [4]])
-//
-// results in
-//
-//    [1, 2, 3, 4]
-//
-func Flatten(xs cue.Value) ([]cue.Value, error) {
-	var flatten func(cue.Value) ([]cue.Value, error)
-	flatten = func(xs cue.Value) ([]cue.Value, error) {
-		var res []cue.Value
-		iter, err := xs.List()
-		if err != nil {
-			return nil, err
-		}
-		for iter.Next() {
-			val := iter.Value()
-			if val.Kind() == cue.ListKind {
-				vals, err := flatten(val)
-				if err != nil {
-					return nil, err
-				}
-				res = append(res, vals...)
-			} else {
-				res = append(res, val)
-			}
-		}
-		return res, nil
-	}
-	return flatten(xs)
-}
+// // Flatten reports a flattend sequence of the list xs by expanding any elements
+// // that are lists.
+// //
+// // For instance:
+// //
+// //    Flatten([1, [[2, 3], []], [4]])
+// //
+// // results in
+// //
+// //    [1, 2, 3, 4]
+// //
+// func Flatten(xs cue.Value) ([]cue.Value, error) {
+// 	var flatten func(cue.Value) ([]cue.Value, error)
+// 	flatten = func(xs cue.Value) ([]cue.Value, error) {
+// 		var res []cue.Value
+// 		iter, err := xs.List()
+// 		if err != nil {
+// 			return nil, err
+// 		}
+// 		for iter.Next() {
+// 			val := iter.Value()
+// 			if val.Kind() == cue.ListKind {
+// 				vals, err := flatten(val)
+// 				if err != nil {
+// 					return nil, err
+// 				}
+// 				res = append(res, vals...)
+// 			} else {
+// 				res = append(res, val)
+// 			}
+// 		}
+// 		return res, nil
+// 	}
+// 	return flatten(xs)
+// }
 
 // FlattenN reports a flattend sequence of the list xs by expanding any elements
 // depth levels deep. If depth is negative all elements are expanded.
@@ -94,10 +97,9 @@
 //
 //    [1, [2, 3], [], 4]
 //
-func FlattenN(xs cue.Value, depth *internal.Decimal) ([]cue.Value, error) {
-	var flattenN func(cue.Value, *internal.Decimal) ([]cue.Value, error)
-	one := apd.New(1, 0)
-	flattenN = func(xs cue.Value, depth *internal.Decimal) ([]cue.Value, error) {
+func FlattenN(xs cue.Value, depth int) ([]cue.Value, error) {
+	var flattenN func(cue.Value, int) ([]cue.Value, error)
+	flattenN = func(xs cue.Value, depth int) ([]cue.Value, error) {
 		var res []cue.Value
 		iter, err := xs.List()
 		if err != nil {
@@ -105,17 +107,13 @@
 		}
 		for iter.Next() {
 			val := iter.Value()
-			if val.Kind() == cue.ListKind && !depth.IsZero() {
-				d := apd.New(0, 0)
-				_, err := internal.BaseContext.Sub(d, depth, one)
+			if val.Kind() == cue.ListKind && depth != 0 {
+				d := depth - 1
+				values, err := flattenN(val, d)
 				if err != nil {
 					return nil, err
 				}
-				vals, err := flattenN(val, d)
-				if err != nil {
-					return nil, err
-				}
-				res = append(res, vals...)
+				res = append(res, values...)
 			} else {
 				res = append(res, val)
 			}
