diff --git a/aern2-real.cabal b/aern2-real.cabal
--- a/aern2-real.cabal
+++ b/aern2-real.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           aern2-real
-version:        0.2.14.1
+version:        0.2.15
 synopsis:       Real numbers as convergent sequences of intervals
 description:    Please see the README on GitHub at <https://github.com/michalkonecny/aern2/#readme>
 category:       Math
@@ -60,7 +60,7 @@
   ghc-options: -Wall
   build-depends:
       QuickCheck
-    , aern2-mp >=0.2.14
+    , aern2-mp >=0.2.15.0
     , base ==4.*
     , collect-errors >=0.1.5
     , hspec
@@ -92,7 +92,7 @@
   ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
   build-depends:
       QuickCheck
-    , aern2-mp >=0.2.14
+    , aern2-mp >=0.2.15.0
     , aern2-real
     , base ==4.*
     , collect-errors >=0.1.5
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,6 +1,8 @@
 # Change log for aern2-real
 
 * current
+* v 0.2.15 2023-04-11
+  * CanSelectCountable instance for CKleenean
 * v 0.2.14.1 2023-04-10
   * fix compilation errors
 * v 0.2.13 2023-04-07
diff --git a/src/AERN2/Real/CKleenean.hs b/src/AERN2/Real/CKleenean.hs
--- a/src/AERN2/Real/CKleenean.hs
+++ b/src/AERN2/Real/CKleenean.hs
@@ -30,6 +30,7 @@
 import AERN2.MP
 
 import AERN2.Real.Type
+import Data.List (uncons)
 
 type CKleenean = CSequence Kleenean
 
@@ -114,6 +115,49 @@
           CN.noValueNumErrorCertain $ CN.NumError "select: Both branches failed!"
         _ -> aux rest1 rest2
     aux _ _ = CN.noValueNumErrorCertain $ CN.NumError "select: internal error"
+
+instance CanSelectCountable CKleenean where
+  type SelectCountableType CKleenean = Integer
+  selectCountable ckleeneans = 
+    findTrue $ concatInfiniteLists (map (unCSequence . ckleeneans) [0..])
+    where
+    findTrue ((ki, i) : rest) =
+      case (CN.toEither ki) of
+        Right CertainTrue -> i
+        _ -> findTrue rest
+    findTrue [] = error "selectCountable: internal error"
+
+{-|
+  Take an infinite list of infinite lists and concatenate all the elements
+  in a single infinite list in such a way that no element is lost.
+  Moreoved, each element has the number of the original list added to it
+  so that it is possible to work out which of the lists it came from.
+
+  This function orders the elements as follows (where each item corresponds
+  to one of the lists and the numbers show the positions in the result list):
+
+  * 1 3 6 10 ... 
+  * 2 5 9 ... 
+  * 4 8 ...
+  * 7 ...
+  * ...
+
+-}
+concatInfiniteLists :: [[t]] -> [(t, Integer)]
+concatInfiniteLists lists = 
+  aux [] listsWithNumbers 
+  where
+  aux openedLists (nextList:remainingLists) =
+    heads ++ (aux tails remainingLists)
+    where
+    (heads, tails) = unzip (map (removeJust . uncons) (nextList:openedLists))
+  aux _ [] = e
+  removeJust (Just x) = x
+  removeJust Nothing = e
+  e = error "concatInfiniteLists can be applied only to a list of infinite lists"
+  listsWithNumbers = 
+    [zip list (repeat listNumber) 
+      | (list, listNumber) <- zip lists [0..]]
 
 instance (CanUnionCNSameType t) =>
   HasIfThenElse CKleenean (CSequence t)
