diff --git a/.ghci b/.ghci
new file mode 100644
--- /dev/null
+++ b/.ghci
@@ -0,0 +1,1 @@
+:set -isrc -idist/build/autogen -optP-include -optPdist/build/autogen/cabal_macros.h
diff --git a/.gitignore b/.gitignore
new file mode 100644
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+dist
+docs
+wiki
+TAGS
+tags
+wip
+.DS_Store
+.*.swp
+.*.swo
+*.o
+*.hi
+*~
+*#
diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,1 +1,8 @@
 language: haskell
+notifications:
+  irc:
+    channels:
+      - "irc.freenode.org#haskell-lens"
+    skip_join: true
+    template:
+      - "\x0313vector-instances\x03/\x0306%{branch}\x03 \x0314%{commit}\x03 %{build_url} %{message}"
diff --git a/.vim.custom b/.vim.custom
new file mode 100644
--- /dev/null
+++ b/.vim.custom
@@ -0,0 +1,31 @@
+" Add the following to your .vimrc to automatically load this on startup
+
+" if filereadable(".vim.custom")
+"     so .vim.custom
+" endif
+
+function StripTrailingWhitespace()
+  let myline=line(".")
+  let mycolumn = col(".")
+  silent %s/  *$//
+  call cursor(myline, mycolumn)
+endfunction
+
+" enable syntax highlighting
+syntax on
+
+" search for the tags file anywhere between here and /
+set tags=TAGS;/
+
+" highlight tabs and trailing spaces
+set listchars=tab:‗‗,trail:‗
+set list
+
+" f2 runs hasktags
+map <F2> :exec ":!hasktags -x -c --ignore src"<CR><CR>
+
+" strip trailing whitespace before saving
+" au BufWritePre *.hs,*.markdown silent! cal StripTrailingWhitespace()
+
+" rebuild hasktags after saving
+au BufWritePost *.hs silent! :exec ":!hasktags -x -c --ignore src"
diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.markdown
@@ -0,0 +1,4 @@
+3.2.1
+-----
+* Refactored build system.
+* Removed bounds on dependencies.
diff --git a/Data/Vector/Instances.hs b/Data/Vector/Instances.hs
deleted file mode 100644
--- a/Data/Vector/Instances.hs
+++ /dev/null
@@ -1,110 +0,0 @@
-{-# LANGUAGE TypeFamilies #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
------------------------------------------------------------------------------
--- |
--- Module      :  Data.Vector.Instances
--- Copyright   :  (c) Edward Kmett 2010
--- License     :  BSD3
--- Maintainer  :  ekmett@gmail.com
--- Stability   :  experimental
--- Portability :  portable
---
------------------------------------------------------------------------------
-
-module Data.Vector.Instances () where
-
-import Prelude hiding ((++), drop, length)
-import Control.Applicative
-import Control.Monad
-import Data.Semigroup
-import Data.Key
-import Data.Functor.Bind
-import Data.Functor.Extend
-import Data.Functor.Plus
-import Data.Pointed
-import Data.Monoid
-import qualified Data.Vector as Vector
-import qualified Data.Vector.Generic as G
-import qualified Data.Vector.Fusion.Stream as Stream
-import Data.Vector.Fusion.Stream.Size
-import Data.Vector (Vector,(++),drop,length,imap,ifoldr, ifoldl, izipWith,(!?),(//), generate)
-import qualified Data.Vector as Vector
-
-type instance Key Vector = Int
-
-instance Keyed Vector where
-  mapWithKey = Vector.imap
-  {-# INLINE mapWithKey #-}
-
-instance Zip Vector where
-  zipWith = Vector.zipWith
-  {-# INLINE zipWith #-}
-
-instance ZipWithKey Vector where
-  zipWithKey = Vector.izipWith
-  {-# INLINE zipWithKey #-}
-
-instance Indexable Vector where
-  index = (!)
-  {-# INLINE index #-}
-
-instance Lookup Vector where
-  lookup = flip (!?) 
-  {-# INLINE lookup #-}
-
-instance Adjustable Vector where
-  adjust f n v = case v !? n of
-    Just a ->  v // [(n, f a)]
-    Nothing -> v
-  {-# INLINE adjust #-}
-
-  replace n a v = v // [(n,a)]
-  {-# INLINE replace #-}
-
-instance FoldableWithKey Vector where
-  foldrWithKey = Vector.ifoldr
-  {-# INLINE foldrWithKey #-}
-  foldlWithKey = Vector.ifoldl
-  {-# INLINE foldlWithKey #-}
-
-instance Apply Vector where
-  fs <.> as =
-    G.unstream $ Stream.sized results (Exact n)
-    where
-      n = Vector.length fs * Vector.length as
-      results = Stream.concatMap body $ G.stream fs
-      body f = Stream.map f $ G.stream as
-  {-# INLINE (<.>) #-}
-
-instance Pointed Vector where
-  point = Vector.singleton
-  {-# INLINE point #-}
-
-instance Bind Vector where
-  v >>- f = Vector.concatMap f v
-  {-# INLINE (>>-) #-}
-
-instance Semigroup (Vector a) where
-  (<>) = (++)
-  {-# INLINE (<>) #-}
-  
-instance Alt Vector where
-  (<!>) = (++)
-  {-# INLINE (<!>) #-}
-
-instance Plus Vector where
-  zero = Vector.empty
-  {-# INLINE zero #-}
-
-instance TraversableWithKey Vector where
-  traverseWithKey f v
-     = Vector.fromListN (Vector.length v) <$> traverseWithKey f (Vector.toList v)
-  {-# INLINE traverseWithKey #-}
-
-instance Extend Vector where
-  duplicated v = generate (length v) (`drop` v)
-  {-# INLINE duplicated #-}
-  extended f v = generate (length v) (\n -> f (drop n v))
-  {-# INLINE extended #-}
-
-
diff --git a/README.markdown b/README.markdown
new file mode 100644
--- /dev/null
+++ b/README.markdown
@@ -0,0 +1,15 @@
+vector-instances
+================
+
+[![Build Status](https://secure.travis-ci.org/ekmett/vector-instances.png?branch=master)](http://travis-ci.org/ekmett/vector-instances)
+
+This provides a standard place for lots of orphan instances for the `vector` package.
+
+Contact Information
+-------------------
+
+Contributions and bug reports are welcome!
+
+Please feel free to contact me through github or on the #haskell IRC channel on irc.freenode.net.
+
+-Edward Kmett
diff --git a/src/Data/Vector/Instances.hs b/src/Data/Vector/Instances.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Vector/Instances.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Data.Vector.Instances
+-- Copyright   :  (c) Edward Kmett 2010
+-- License     :  BSD3
+-- Maintainer  :  ekmett@gmail.com
+-- Stability   :  experimental
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+
+module Data.Vector.Instances () where
+
+import Prelude hiding ((++), drop, length)
+import Control.Applicative
+import Control.Monad
+import Data.Semigroup
+import Data.Key
+import Data.Functor.Bind
+import Data.Functor.Extend
+import Data.Functor.Plus
+import Data.Pointed
+import Data.Monoid
+import qualified Data.Vector as Vector
+import qualified Data.Vector.Generic as G
+import qualified Data.Vector.Fusion.Stream as Stream
+import Data.Vector.Fusion.Stream.Size
+import Data.Vector (Vector,(++),drop,length,imap,ifoldr, ifoldl, izipWith,(!?),(//), generate)
+import qualified Data.Vector as Vector
+
+type instance Key Vector = Int
+
+instance Keyed Vector where
+  mapWithKey = Vector.imap
+  {-# INLINE mapWithKey #-}
+
+instance Zip Vector where
+  zipWith = Vector.zipWith
+  {-# INLINE zipWith #-}
+
+instance ZipWithKey Vector where
+  zipWithKey = Vector.izipWith
+  {-# INLINE zipWithKey #-}
+
+instance Indexable Vector where
+  index = (!)
+  {-# INLINE index #-}
+
+instance Lookup Vector where
+  lookup = flip (!?) 
+  {-# INLINE lookup #-}
+
+instance Adjustable Vector where
+  adjust f n v = case v !? n of
+    Just a ->  v // [(n, f a)]
+    Nothing -> v
+  {-# INLINE adjust #-}
+
+  replace n a v = v // [(n,a)]
+  {-# INLINE replace #-}
+
+instance FoldableWithKey Vector where
+  foldrWithKey = Vector.ifoldr
+  {-# INLINE foldrWithKey #-}
+  foldlWithKey = Vector.ifoldl
+  {-# INLINE foldlWithKey #-}
+
+instance Apply Vector where
+  fs <.> as =
+    G.unstream $ Stream.sized results (Exact n)
+    where
+      n = Vector.length fs * Vector.length as
+      results = Stream.concatMap body $ G.stream fs
+      body f = Stream.map f $ G.stream as
+  {-# INLINE (<.>) #-}
+
+instance Pointed Vector where
+  point = Vector.singleton
+  {-# INLINE point #-}
+
+instance Bind Vector where
+  v >>- f = Vector.concatMap f v
+  {-# INLINE (>>-) #-}
+
+instance Semigroup (Vector a) where
+  (<>) = (++)
+  {-# INLINE (<>) #-}
+  
+instance Alt Vector where
+  (<!>) = (++)
+  {-# INLINE (<!>) #-}
+
+instance Plus Vector where
+  zero = Vector.empty
+  {-# INLINE zero #-}
+
+instance TraversableWithKey Vector where
+  traverseWithKey f v
+     = Vector.fromListN (Vector.length v) <$> traverseWithKey f (Vector.toList v)
+  {-# INLINE traverseWithKey #-}
+
+instance Extend Vector where
+  duplicated v = generate (length v) (`drop` v)
+  {-# INLINE duplicated #-}
+  extended f v = generate (length v) (\n -> f (drop n v))
+  {-# INLINE extended #-}
+
+
diff --git a/vector-instances.cabal b/vector-instances.cabal
--- a/vector-instances.cabal
+++ b/vector-instances.cabal
@@ -1,5 +1,5 @@
 name:                vector-instances
-version:             3.2
+version:             3.2.1
 synopsis:            Orphan Instances for 'Data.Vector'
 homepage:            http://github.com/ekmett/vector-instances
 bug-reports:         http://github.com/ekmett/vector-instances/issues
@@ -10,24 +10,27 @@
 category:            Data, Data Structures
 build-type:          Simple
 cabal-version:       >=1.6
-extra-source-files: .travis.yml
+extra-source-files:
+  .travis.yml
+  .ghci
+  .vim.custom
+  .gitignore
+  CHANGELOG.markdown
+  README.markdown
 
 source-repository head
   type: git
   location: git://github.com/ekmett/vector-instances.git
 
 library
-  other-extensions:
-    TypeFamilies
-
-  exposed-modules:
-    Data.Vector.Instances
-
+  other-extensions: TypeFamilies
+  exposed-modules: Data.Vector.Instances
+  hs-source-dirs: src
   build-depends:
     base          >= 4       && < 5,
     vector        >= 0.9     && < 0.11,
-    semigroupoids >= 3.0     && < 3.1,
-    semigroups    >= 0.8.3.1 && < 0.9,
-    comonad       >= 3.0     && < 3.1,
-    pointed       >= 3.0     && < 3.1,
-    keys          >= 3.0     && < 3.1
+    semigroupoids >= 3,
+    semigroups    >= 0.8.3.1,
+    comonad       >= 3,
+    pointed       >= 3,
+    keys          >= 3
