diff --git a/Biobase/AAseq.hs b/Biobase/AAseq.hs
--- a/Biobase/AAseq.hs
+++ b/Biobase/AAseq.hs
@@ -5,6 +5,8 @@
 {-# LANGUAGE StandaloneDeriving #-}
 {-# LANGUAGE PatternGuards #-}
 {-# LANGUAGE ViewPatterns #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
 
 -- | This module has the translation tables for the genetic code.
 
@@ -14,6 +16,7 @@
 import           Data.Ix (Ix(..))
 import           Data.Primitive.Types
 import           Data.Tuple (swap)
+import           Data.Vector.Unboxed.Deriving
 import           GHC.Base (remInt,quotInt)
 import qualified Data.ByteString.Char8 as BS
 import qualified Data.ByteString.Lazy.Char8 as BSL
@@ -23,11 +26,11 @@
 import qualified Data.Vector.Generic.Mutable as VGM
 import qualified Data.Vector.Unboxed as VU
 
-import Data.Array.Repa.ExtShape
-import Data.Array.Repa.Index
-import Data.Array.Repa.Shape
+import           Data.Array.Repa.ExtShape
+import           Data.Array.Repa.Index
+import           Data.Array.Repa.Shape
 
-import Biobase.Primary
+import           Biobase.Primary
 
 
 
@@ -188,11 +191,6 @@
     | Just aa <- x `lookup` charAAList = [(aa,xs)]
     | otherwise = []
 
-deriving instance Prim AA
-deriving instance VGM.MVector VU.MVector AA
-deriving instance VG.Vector VU.Vector AA
-deriving instance VU.Unbox AA
-
 instance (Shape sh,Show sh) => Shape (sh :. AA) where
   rank (sh:._) = rank sh + 1
   zeroDim = zeroDim:.AA 0
@@ -250,4 +248,7 @@
 
 instance MkAAseq T.Text where
   mkAAseq = VU.fromList . map toAA . T.unpack
+
+derivingUnbox "AA"
+  [t| AA -> Int |] [| unAA |] [| AA |]
 
diff --git a/Biobase/Primary.hs b/Biobase/Primary.hs
--- a/Biobase/Primary.hs
+++ b/Biobase/Primary.hs
@@ -1,12 +1,14 @@
-{-# LANGUAGE PackageImports #-}
-{-# LANGUAGE TypeOperators #-}
-{-# LANGUAGE PatternGuards #-}
-{-# LANGUAGE OverlappingInstances #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE TypeSynonymInstances #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverlappingInstances #-}
+{-# LANGUAGE PackageImports #-}
+{-# LANGUAGE PatternGuards #-}
 {-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE TypeSynonymInstances #-}
 
 -- | The primary structure: interface to efficient encoding of RNA and DNA
 -- sequences. The design aims toward the 'vector' library and repa. In
@@ -20,11 +22,12 @@
 
 module Biobase.Primary where
 
-import Data.Char (toUpper)
-import Data.Ix (Ix(..))
-import Data.Primitive.Types
-import Data.Tuple (swap)
-import GHC.Base (remInt,quotInt)
+import           Data.Char (toUpper)
+import           Data.Ix (Ix(..))
+import           Data.Primitive.Types
+import           Data.Tuple (swap)
+import           Data.Vector.Unboxed.Deriving
+import           GHC.Base (remInt,quotInt)
 import qualified Data.ByteString.Char8 as BS
 import qualified Data.ByteString.Lazy.Char8 as BSL
 import qualified Data.Text as T
@@ -32,13 +35,14 @@
 import qualified Data.Vector.Generic.Mutable as VGM
 import qualified Data.Vector.Unboxed as VU
 
-import Data.Array.Repa.ExtShape
-import Data.Array.Repa.Index
-import Data.Array.Repa.Shape
+import           Data.Array.Repa.ExtShape
+import           Data.Array.Repa.Index
+import           Data.Array.Repa.Shape
 
-import Biobase.Primary.Bounds
+import           Biobase.Primary.Bounds
 
 
+
 -- * Convert different types of sequence representations to the internal
 -- "Primary Structure" representation
 
@@ -131,12 +135,8 @@
     | Just n <- x `lookup` charNucList = [(n,xs)]
     | otherwise = []
 
--- for vectors
-
-deriving instance Prim Nuc
-deriving instance VGM.MVector VU.MVector Nuc
-deriving instance VG.Vector VU.Vector Nuc
-deriving instance VU.Unbox Nuc
+derivingUnbox "Nuc"
+  [t| Nuc -> Int |] [| unNuc |] [| Nuc |]
 
 -- Shape-based indexing. Nucleotide representations go from nN (0) to nU (4),
 -- with additional symbols being available for specialized problems. This is a
diff --git a/Biobase/Primary/Hashed.hs b/Biobase/Primary/Hashed.hs
--- a/Biobase/Primary/Hashed.hs
+++ b/Biobase/Primary/Hashed.hs
@@ -1,30 +1,34 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE StandaloneDeriving #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
 
 -- | Fast hash functions for 'Primary' sequences. A hash is just an 'Int', so
 -- use these only for short sequences.
+--
+-- TODO replace with standard hashing functions used by Haskell libs?
 
 module Biobase.Primary.Hashed where
 
-import Control.Exception.Base (assert)
-import Data.Ix
-import Data.Primitive.Types
+import           Control.Exception.Base (assert)
+import           Data.Ix
+import           Data.Primitive.Types
+import           Data.Vector.Unboxed.Deriving
 import qualified Data.Vector.Generic as VG
 import qualified Data.Vector.Generic.Mutable as VGM
 import qualified Data.Vector.Unboxed as VU
 
-import Biobase.Primary
+import           Biobase.Primary
 
 
 
-newtype HashedPrimary = HashedPrimary Int
+newtype HashedPrimary = HashedPrimary { unHashedPrimary :: Int }
   deriving (Eq,Ord,Ix,Read,Show,Enum,Bounded)
 
-deriving instance Prim HashedPrimary
-deriving instance VGM.MVector VU.MVector HashedPrimary
-deriving instance VG.Vector VU.Vector HashedPrimary
-deriving instance VU.Unbox HashedPrimary
+derivingUnbox "HashedPrimary"
+  [t| HashedPrimary -> Int |] [| unHashedPrimary |] [| HashedPrimary |]
+
 
 -- | Given a piece of primary sequence information, reduce it to an index.
 --
diff --git a/Biobase/Secondary.hs b/Biobase/Secondary.hs
--- a/Biobase/Secondary.hs
+++ b/Biobase/Secondary.hs
@@ -7,6 +7,8 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE OverlappingInstances #-}
 {-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
 
 -- | Secondary structure: define basepairs as Int-tuples, the three edges, a
 -- nucleotide can use for pairing and the cis/trans isomerism. Both edges and
@@ -17,20 +19,21 @@
 
 module Biobase.Secondary where
 
-import Data.Array.Repa.Index
-import Data.Array.Repa.Shape
-import Data.Char (toLower, toUpper)
-import Data.Ix (Ix(..))
-import Data.List as L
-import Data.Primitive.Types
-import Data.Tuple (swap)
-import GHC.Base (remInt,quotInt)
+import           Data.Array.Repa.Index
+import           Data.Array.Repa.Shape
+import           Data.Char (toLower, toUpper)
+import           Data.Ix (Ix(..))
+import           Data.List as L
+import           Data.Primitive.Types
+import           Data.Tuple (swap)
+import           Data.Vector.Unboxed.Deriving
+import           GHC.Base (remInt,quotInt)
 import qualified Data.Vector.Generic as VG
 import qualified Data.Vector.Generic.Mutable as VGM
 import qualified Data.Vector.Unboxed as VU
 
-import Biobase.Primary
-import Biobase.Primary.Bounds
+import           Biobase.Primary
+import           Biobase.Primary.Bounds
 
 
 
@@ -183,11 +186,6 @@
 
 -- ** Instances for 'Edge'
 
-deriving instance Prim Edge
-deriving instance VGM.MVector VU.MVector Edge
-deriving instance VG.Vector VU.Vector Edge
-deriving instance VU.Unbox Edge
-
 instance Bounded Edge where
   minBound = wc
   maxBound = unknownEdge
@@ -204,11 +202,6 @@
 
 -- ** Instances for 'CTisomerism'
 
-deriving instance Prim CTisomerism
-deriving instance VGM.MVector VU.MVector CTisomerism
-deriving instance VG.Vector VU.Vector CTisomerism
-deriving instance VU.Unbox CTisomerism
-
 instance Bounded CTisomerism where
   minBound = cis
   maxBound = unknownCT
@@ -346,4 +339,10 @@
   {-# INLINE updR #-}
   {-# INLINE updP #-}
   {-# INLINE updT #-}
+
+derivingUnbox "Edge"
+  [t| Edge -> Int |] [| unEdge |] [| Edge |]
+
+derivingUnbox "CTisomerism"
+  [t| CTisomerism -> Int |] [| unCT |] [| CT |]
 
diff --git a/Biobase/Secondary/Vienna.hs b/Biobase/Secondary/Vienna.hs
--- a/Biobase/Secondary/Vienna.hs
+++ b/Biobase/Secondary/Vienna.hs
@@ -5,34 +5,37 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
 
 -- | Encoding of Watson-Crick and Wobble Pairs in the Vienna RNA package style.
 
 module Biobase.Secondary.Vienna where
 
-import Data.Array.Repa.Index
-import Data.Array.Repa.Shape
-import Data.Ix
-import Data.Primitive.Types
-import Data.Tuple (swap)
-import GHC.Base (remInt,quotInt)
+import           Data.Array.Repa.Index
+import           Data.Array.Repa.Shape
+import           Data.Ix
+import           Data.Primitive.Types
+import           Data.Tuple (swap)
+import           Data.Vector.Unboxed.Deriving
+import           GHC.Base (remInt,quotInt)
+import           Prelude as P
 import qualified Data.Vector.Generic as VG
 import qualified Data.Vector.Generic.Mutable as VGM
 import qualified Data.Vector.Unboxed as VU
-import Prelude as P
 
-import Data.Array.Repa.ExtShape
-import Data.PrimitiveArray as PA
-import Data.PrimitiveArray.Zero as PA
+import           Data.Array.Repa.ExtShape
+import           Data.PrimitiveArray as PA
+import           Data.PrimitiveArray.Zero as PA
 
-import Biobase.Primary
-import Biobase.Primary.Bounds
+import           Biobase.Primary
+import           Biobase.Primary.Bounds
 
 
 
 -- | Use machine Ints internally
 
-newtype ViennaPair = ViennaPair Int
+newtype ViennaPair = ViennaPair { unViennaPair :: Int }
   deriving (Eq,Ord,Ix)
 
 instance (Shape sh,Show sh) => Shape (sh :. ViennaPair) where
@@ -119,11 +122,6 @@
   ]
 {-# NOINLINE viennaPairTable #-}
 
-deriving instance VGM.MVector VU.MVector ViennaPair
-deriving instance VG.Vector VU.Vector ViennaPair
-deriving instance VU.Unbox ViennaPair
-deriving instance Prim ViennaPair
-
 instance Enum ViennaPair where
   toEnum x
     | x>=0 && x<=7 = ViennaPair x
@@ -178,4 +176,7 @@
 cguaP = [vpCG..vpUA]
 cgnsP = [vpCG..vpNS]
 pairToString = [(vpCG,"CG"),(vpGC,"GC"),(vpUA,"UA"),(vpAU,"AU"),(vpGU,"GU"),(vpUG,"UG"),(vpNS,"NS"),(vpNP,"NP")]
+
+derivingUnbox "ViennaPair"
+  [t| ViennaPair -> Int |] [| unViennaPair |] [| ViennaPair |]
 
diff --git a/BiobaseXNA.cabal b/BiobaseXNA.cabal
--- a/BiobaseXNA.cabal
+++ b/BiobaseXNA.cabal
@@ -1,9 +1,9 @@
 name:           BiobaseXNA
-version:        0.8.2.0
+version:        0.8.3.0
 author:         Christian Hoener zu Siederdissen
 maintainer:     choener@tbi.univie.ac.at
 homepage:       http://www.tbi.univie.ac.at/~choener/
-copyright:      Christian Hoener zu Siederdissen, 2011-2013
+copyright:      Christian Hoener zu Siederdissen, 2011-2014
 category:       Bioinformatics
 synopsis:       Efficient RNA/DNA representations
 license:        GPL-3
@@ -40,17 +40,18 @@
 library
   build-depends:
     base >3 && <5,
-    bytestring     >= 0.10          ,
-    containers     >= 0.4           ,
-    csv            >= 0.1.2         ,
-    file-embed     >= 0.0.4.7       ,
-    mtl            >= 2.1           ,
-    primitive      >= 0.5           ,
-    PrimitiveArray >= 0.5.4         ,
-    repa           >= 3.2           ,
-    text           >= 0.11          ,
-    tuple          >= 0.2           ,
-    vector         >= 0.10
+    bytestring      >= 0.10           ,
+    containers      >= 0.4            ,
+    csv             >= 0.1.2          ,
+    file-embed      >= 0.0.4.7        ,
+    mtl             >= 2.1            ,
+    primitive       >= 0.5            ,
+    PrimitiveArray  >= 0.5.4          ,
+    repa            >= 3.2            ,
+    text            >= 0.11           ,
+    tuple           >= 0.2            ,
+    vector          >= 0.10           ,
+    vector-th-unbox >= 0.2
 
   exposed-modules:
     Biobase.AAseq
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+0.8.3.0
+-------
+
+- bugfix version: use vector-th-unbox to generate unboxed vector instances
+
 0.8.2.0
 -------
 
