diff --git a/Data/Generics/Alloy/GenInstances.hs b/Data/Generics/Alloy/GenInstances.hs
--- a/Data/Generics/Alloy/GenInstances.hs
+++ b/Data/Generics/Alloy/GenInstances.hs
@@ -62,8 +62,9 @@
 -- package on Hackage for more details.
 module Data.Generics.Alloy.GenInstances
   (writeInstances, writeInstancesTo,
-   justPure, allInstances, instanceImports, instanceImportsMapSet,
+   justPure, allInstances, instanceImports, instanceImportsMapSet, instanceImportsVector,
    GenInstance, genInstance, genMapInstance, genSetInstance, genInstances, languageExtras,
+   genVectorInstance,
    GenOverlappedOption(..), GenClassOption(GenOneClass), GenInstanceConfig(..)) where
 
 import Control.Monad.State
@@ -74,8 +75,10 @@
 import qualified Data.Map as Map
 import Data.Ord
 import Data.Set (Set)
+import Data.Vector (Vector)
 import qualified Data.Set as Set
 import qualified Data.Typeable as Ty
+import qualified Data.Vector as Vector
 
 #if __GLASGOW_HASKELL__ < 702
 type TypeRepKey = Int
@@ -255,6 +258,56 @@
   where
     s :: Set a
     s = undefined
+
+-- | Generates an instance for the 'Data.Vector.Vector' type. Like
+-- 'Data.Map.Map', the Data instance for Vector hides its representation.
+genVectorInstance :: forall v. (Data v) => v -> GenInstance
+genVectorInstance v = GenInstance $ do
+  findTypesIn (const Nothing) v
+  tk <- liftIO $ typeKey m
+  modify $ Map.insert tk $ (,) (toQualName m)
+    $ Detailed (DataBox m) [DataBox v]
+      $ \ cl (funcSameType, funcNewType) -> concat
+        [ case cl of
+          ClassAlloyARoute -> map concat
+            [ [ funcSameType b
+              , " _ ops (v, r) = let mns = zip (Vector.toList v) (map ((r @->) . routeDataMap) [0..]) in"
+              ]
+            , [ "  "
+              , funcPlain b
+              , " Vector.fromList "
+              , funcAp b
+              , " ("
+              , funcTraverse b
+              , " ("
+              , funcNewType b
+              , " ops BaseOpARoute) mns)"
+              ]
+            ]
+          _ -> ((:[]) . concat)
+            [ funcSameType b
+            , " _ ops v = "
+            , funcPlain b
+            , " Vector.fromList "
+            , funcAp b
+            , " ("
+            , funcTraverse b
+            , " ("
+            , funcNewType b
+            , " ops "
+            , terminator
+            , ") (Vector.toList v))"
+            ]
+            where
+              terminator = case cl of
+                ClassAlloyA -> "BaseOpA"
+                ClassAlloy -> "BaseOp"
+
+        | b <- funcsForClass cl
+        ]
+  where
+    m :: Vector v
+    m = undefined
   
 -- Explanation of Alloy's instances:
 --
@@ -592,6 +645,14 @@
                      ,"Data.Set(Set)", "qualified Data.Set as Set"
                      ,"qualified Data.Traversable as T"
                      ]
+
+-- | Like 'instanceImportsMapSet' but for 'Data.Vector.Vector'.
+instanceImportsVector :: [String]
+instanceImportsVector = instanceImports ++ map ("import " ++)
+  [ "Data.Vector (Vector)"
+  , "qualified Data.Vector as Vector"
+  , "qualified Data.Traversable as T"
+  ]
 
 -- | Generates all the given instances (eliminating any duplicates)
 -- with the given options.  The return is a list of lines of code.  This should
diff --git a/alloy.cabal b/alloy.cabal
--- a/alloy.cabal
+++ b/alloy.cabal
@@ -1,5 +1,5 @@
 Name: alloy
-Version: 1.1.0
+Version: 1.2.0
 License: BSD3
 License-File: LICENSE
 Author: Neil Brown and Adam Sampson
@@ -30,7 +30,7 @@
                     tutorial/Selective.lhs
 
 Library
-  Build-Depends:   base >= 4.3 && < 5, containers, mtl, syb
+  Build-Depends:   base >= 4.3 && < 5, containers, mtl, syb, vector
 
   Exposed-modules: Data.Generics.Alloy
                    Data.Generics.Alloy.Effect
