diff --git a/src/Data/Params.hs b/src/Data/Params.hs
--- a/src/Data/Params.hs
+++ b/src/Data/Params.hs
@@ -36,6 +36,7 @@
     , TypeLens (..)
     , GetParam
     , SetParam
+    , SetParam'
     , Base
     , _base
     , zoom
@@ -364,6 +365,7 @@
 -- type family SetParam (p::k1) (a::k2) (t:: *) :: *
 type family GetParam (p::k1) (t:: *) :: k3
 type family SetParam (p::k1) (a::k2) (t:: *) :: *
+type family SetParam' (p :: * -> Constraint) (a :: *) (t :: *) :: *
 
 type family Zoom (p :: k1) :: k2
 type family EyePiece (p :: k1) :: k2
@@ -379,6 +381,7 @@
 _base = TypeLens
 type instance GetParam Base t = t
 type instance SetParam Base (c :: *) t = c
+type instance SetParam' Base c t = c
 
 type ParamIndex p = 
     ( ReifiableConstraint (ApplyConstraint_GetConstraint p)
@@ -567,20 +570,35 @@
 -- > data NearestNeighbor (k :: Param Nat) (maxdist :: Param Float) elem = ...
 -- > mkParams ''NearestNeighbor
 --
-
 mkParams :: Name -> Q [Dec]
 mkParams dataname = do
     info <- TH.reify dataname
+
+    -- if dataname refers to a type synonym, then extract the principal
+    -- constructor and call mkParams' on that
+    case info of 
+        TyConI (TySynD _ _             (ConT dataname')      ) -> mkParams' dataname'
+        TyConI (TySynD _ _       (AppT (ConT dataname') _)   ) -> mkParams' dataname'
+        TyConI (TySynD _ _ (AppT (AppT (ConT dataname') _) _)) -> mkParams' dataname'
+        otherwise -> mkParams' dataname
+
+-- this function assumes that dataname is not a type synonym
+mkParams' :: Name -> Q [Dec]
+mkParams' dataname = do
+    info <- TH.reify dataname
     let tyVarBndrL = case info of
+            FamilyI (FamilyD _ _ xs _) _ -> xs
             TyConI (NewtypeD _ _ xs _ _) -> xs
             TyConI (DataD _ _ xs _ _) -> xs
-            FamilyI (FamilyD _ _ xs _) _ -> xs
+            otherwise -> error $ "mkParams case; info="++show info
 
-    let (tyVarBndrL_Config,tyVarBndrL_Star) = partition filtergo tyVarBndrL 
+    let tyVarBndrL' = filter go tyVarBndrL
+        go (KindedTV name _) = head (nameBase name) /= '_'
+        go (PlainTV name)    = head (nameBase name) /= '_'
+
+    let (tyVarBndrL_Config,tyVarBndrL_Star) = partition filtergo tyVarBndrL'
         filtergo (KindedTV _ (AppT (ConT maybe) _)) = nameBase maybe=="Config"
         filtergo _ = False
-    
---     getterssetters <- mkGettersSetters dataname
 
     configparams <- forM tyVarBndrL_Config $ \tyVarBndr -> do
         let paramstr = tyVarBndr2str tyVarBndr
@@ -735,6 +753,8 @@
 --
 -- > type instance SetParam (Param_vi p) vi' (Type ... vi ... )) 
 -- >    = SetParam Param_vi (SetParam p vi' vi) t
+-- > type instance SetParam' (Param_vi p) vi' (Type ... vi ... )) 
+-- >    = SetParam Param_vi (SetParam p vi' vi) t
 --
 -- > type instance Zoom (Param_vi a) = a
 -- > type instance EyePiece (Param_vi a) = Param_vi
@@ -786,6 +806,39 @@
     let setters = 
             [ TySynInstD
                 ( mkName "SetParam" )
+                ( TySynEqn
+                    [ AppT (ConT $ mkName $ "Param_"++paramstr) (VarT $ mkName "p")
+                    , VarT $ mkName $ "newparam"
+                    , VarT $ mkName "t" 
+                    ]
+                    ( AppT
+                        ( AppT
+                            ( AppT
+                                ( ConT $ mkName "SetParam" )
+                                ( ConT $ mkName $ "Param_"++paramstr)
+                            )
+                            ( AppT
+                                ( AppT
+                                    ( AppT
+                                        ( ConT $ mkName "SetParam" )
+                                        ( VarT $ mkName "p" )
+                                    )
+                                    ( VarT $ mkName "newparam" )
+                                )
+                                ( AppT
+                                    ( AppT
+                                        ( ConT $ mkName "GetParam" )
+                                        ( ConT $ mkName $ "Param_"++paramstr )
+                                    )
+                                    ( VarT $ mkName "t" )
+                                )
+                            )
+                        )
+                        ( VarT $ mkName "t" )
+                    )
+                )
+            , TySynInstD
+                ( mkName "SetParam'" )
                 ( TySynEqn
                     [ AppT (ConT $ mkName $ "Param_"++paramstr) (VarT $ mkName "p")
                     , VarT $ mkName $ "newparam"
diff --git a/src/Data/Params/Vector/Unboxed.hs b/src/Data/Params/Vector/Unboxed.hs
--- a/src/Data/Params/Vector/Unboxed.hs
+++ b/src/Data/Params/Vector/Unboxed.hs
@@ -15,7 +15,6 @@
 
 import Control.Monad
 import Control.Monad.Primitive
-import Control.Monad.Random
 import Control.DeepSeq
 import Data.Primitive
 import Data.Primitive.ByteArray
@@ -40,9 +39,7 @@
 import Data.Params
 import Data.Params.Vector
 import Data.Params.PseudoPrim
-import Unsafe.Coerce
 
-import Language.Haskell.TH.Syntax hiding (reify)
 import Debug.Trace
 
 
diff --git a/typeparams.cabal b/typeparams.cabal
--- a/typeparams.cabal
+++ b/typeparams.cabal
@@ -1,5 +1,5 @@
 Name:                typeparams
-Version:             0.0.2.0
+Version:             0.0.3.0
 Synopsis:            Lens-like interface for type level parameters; allows unboxed unboxed vectors and supercompilation
 Description:         
     This library provides a lens-like interface for working with type parameters. In the code:
@@ -17,27 +17,22 @@
 Maintainer:          mike@izbicki.me
 Build-Type:          Simple
 Cabal-Version:       >=1.8
-homepage:            http://github.com/mikeizbicki/params/
-bug-reports:         http://github.com/mikeizbicki/params/issues
+homepage:            http://github.com/mikeizbicki/typeparams/
+bug-reports:         http://github.com/mikeizbicki/typeparams/issues
 
 Library
     Build-Depends:      
-        -- common dependencies
-        base                >= 3 && < 5,
-        template-haskell,
+        base                >= 4.7 && < 5,
         deepseq             >= 1.3,
-
-        -- 
         tagged              >= 0.7,
         reflection          >= 1.3,
         constraints         >= 0.3.4,
-
         primitive           >= 0.5,
+        template-haskell    ,
         ghc-prim            ,
 
         -- examples
-        vector              >= 0.10,
-        MonadRandom         >= 0.1.13
+        vector              >= 0.10
         
     hs-source-dirs:     
         src
