diff --git a/comfort-array.cabal b/comfort-array.cabal
--- a/comfort-array.cabal
+++ b/comfort-array.cabal
@@ -1,5 +1,5 @@
 Name:             comfort-array
-Version:          0.5
+Version:          0.5.1
 License:          BSD3
 License-File:     LICENSE
 Author:           Henning Thielemann <haskell@henning-thielemann.de>
@@ -90,7 +90,7 @@
   test-module.list
 
 Source-Repository this
-  Tag:         0.5
+  Tag:         0.5.1
   Type:        darcs
   Location:    https://hub.darcs.net/thielema/comfort-array/
 
diff --git a/src/Data/Array/Comfort/Container.hs b/src/Data/Array/Comfort/Container.hs
--- a/src/Data/Array/Comfort/Container.hs
+++ b/src/Data/Array/Comfort/Container.hs
@@ -5,7 +5,7 @@
 while preserving the container structure.
 -}
 module Data.Array.Comfort.Container (
-   C(..), EqShape(..), NFShape(..),
+   C(..), EqShape(..), NFShape(..), Indexed(..),
    ) where
 
 import qualified Data.Array.Comfort.Shape as Shape
@@ -40,7 +40,14 @@
 class (C f) => EqShape f where
    eqShape :: Shape f -> Shape f -> Bool
 
+class (C f) => Indexed f where
+   type Index f
+   indices :: Shape f -> [Index f]
+   unifiedSizeOffset ::
+      (Shape.Checking check) =>
+      Shape f -> (Int, Index f -> Shape.Result check Int)
 
+
 instance (NFShape f) => NFData (Shape f) where
    rnf = rnfShape
 
@@ -50,7 +57,12 @@
 instance (C f) => Shape.C (Shape f) where
    size = shapeSize
 
+instance (Indexed f) => Shape.Indexed (Shape f) where
+   type Index (Shape f) = Index f
+   indices = indices
+   unifiedSizeOffset = unifiedSizeOffset
 
+
 instance C [] where
    data Shape [] = ShapeList Int
       deriving (Show)
@@ -64,7 +76,16 @@
 instance NFShape [] where
    rnfShape (ShapeList n) = rnf n
 
+instance Indexed [] where
+   type Index [] = Int
+   indices (ShapeList len) = take len $ iterate (1+) 0
+   unifiedSizeOffset (ShapeList len) =
+      (len, \ix -> do
+         Shape.assert "Shape.Container.[]: array index too small" $ ix>=0
+         Shape.assert "Shape.Container.[]: array index too big" $ ix<len
+         return ix)
 
+
 {-
 instance Foldable only available since GHC-8.0. :-(
 Could be circumvented by Data.Orphans
@@ -102,7 +123,17 @@
 instance (NFShape f) => NFShape (NonEmpty.T f) where
    rnfShape (ShapeNonEmpty c) = rnfShape c
 
+instance (C f) => Indexed (NonEmpty.T f) where
+   type Index (NonEmpty.T f) = Int
+   indices shape = take (shapeSize shape) $ iterate (1+) 0
+   unifiedSizeOffset shape =
+      let len = shapeSize shape in
+      (len, \ix -> do
+         Shape.assert "Shape.Container.NonEmpty: array index too small" $ ix>=0
+         Shape.assert "Shape.Container.NonEmpty: array index too big" $ ix<len
+         return ix)
 
+
 instance C Empty.T where
    data Shape Empty.T = ShapeEmpty
       deriving (Show)
@@ -133,7 +164,12 @@
 instance (NFData k, Ord k) => NFShape (Map k) where
    rnfShape (ShapeMap set) = rnf set
 
+instance (Ord k) => Indexed (Map k) where
+   type Index (Map k) = k
+   indices (ShapeMap set) = Set.toAscList set
+   unifiedSizeOffset (ShapeMap set) = Shape.unifiedSizeOffset set
 
+
 instance (Ord k) => C (NonEmptyMap.T k) where
    data Shape (NonEmptyMap.T k) = ShapeNonEmptyMap (NonEmptySet.T k)
       deriving (Show)
@@ -148,3 +184,10 @@
 
 instance (NFData k, Ord k) => NFShape (NonEmptyMap.T k) where
    rnfShape (ShapeNonEmptyMap set) = rnf set
+
+instance (Ord k) => Indexed (NonEmptyMap.T k) where
+   type Index (NonEmptyMap.T k) = k
+   indices (ShapeNonEmptyMap set) =
+      NonEmpty.flatten $ NonEmptySet.toAscList set
+   unifiedSizeOffset (ShapeNonEmptyMap set) =
+      Shape.unifiedSizeOffset (NonEmptySet.flatten set)
diff --git a/src/Data/Array/Comfort/Shape.hs b/src/Data/Array/Comfort/Shape.hs
--- a/src/Data/Array/Comfort/Shape.hs
+++ b/src/Data/Array/Comfort/Shape.hs
@@ -307,7 +307,7 @@
 
 instance (Integral n) => Indexed (ZeroBased n) where
    type Index (ZeroBased n) = n
-   indices (ZeroBased len) = indices $ Shifted 0 len
+   indices (ZeroBased len) = takeWhile (<len) $ iterate (+1) 0
    unifiedOffset (ZeroBased len) = unifiedOffset $ Shifted 0 len
    inBounds (ZeroBased len) ix = 0<=ix && ix<len
 
@@ -354,7 +354,7 @@
 
 instance (Integral n) => Indexed (OneBased n) where
    type Index (OneBased n) = n
-   indices (OneBased len) = indices $ Shifted 1 len
+   indices (OneBased len) = takeWhile (<=len) $ iterate (+1) 1
    unifiedOffset (OneBased len) = unifiedOffset $ Shifted 1 len
    inBounds (OneBased len) ix = 0<ix && ix<=len
 
