diff --git a/fay.cabal b/fay.cabal
--- a/fay.cabal
+++ b/fay.cabal
@@ -1,5 +1,5 @@
 name:                fay
-version:             0.18.0.4
+version:             0.18.0.5
 synopsis:            A compiler for Fay, a Haskell subset that compiles to JavaScript.
 description:         Fay is a proper subset of Haskell which is type-checked
                      with GHC, and compiled to JavaScript. It is lazy, pure, has a Fay monad,
@@ -102,44 +102,44 @@
                      , Fay.Compiler.Typecheck
                      , Paths_fay
   ghc-options:       -O2 -Wall -fno-warn-name-shadowing
-  build-depends:     base >= 4 && < 5
-                   , Cabal
-                   , HUnit
-                   , aeson
-                   , attoparsec
-                   , bytestring
-                   , containers
-                   , cpphs
-                   , data-default
-                   , directory
-                   , filepath
-                   , ghc-paths
-                   , haskell-names >= 0.3.1 && < 0.4
-                   , haskell-packages >= 0.2.3.1
-                   , haskell-src-exts >= 1.14
-                   , language-ecmascript >= 0.15 && < 1.0
-                   , mtl
-                   , pretty-show >= 1.6
-                   , process
-                   , safe
-                   , split
-                   , syb
-                   , test-framework
-                   , test-framework-hunit
-                   , test-framework-th
-                   , text
-                   , time
-                   , unordered-containers
-                   , utf8-string
-                   , vector
-                   , sourcemap
+  build-depends:     base                 >= 4       && < 5
+                   , Cabal                              < 1.19
+                   , HUnit                              < 1.3
+                   , aeson                              < 0.7
+                   , attoparsec                         < 0.11
+                   , bytestring                         < 0.11
+                   , containers                         < 0.6
+                   , cpphs                              < 1.19
+                   , data-default                       < 0.6
+                   , directory                          < 1.3
+                   , filepath                           < 1.4
+                   , ghc-paths                          < 0.2
+                   , haskell-names        >= 0.3.1   && < 0.4
+                   , haskell-packages     >= 0.2.3.1 && < 0.3
+                   , haskell-src-exts     >= 1.14    && < 1.15
+                   , language-ecmascript  >= 0.15    && < 1.0
+                   , mtl                                < 2.2
+                   , pretty-show          >= 1.6     && < 1.7
+                   , process                            < 1.2
+                   , safe                               < 0.4
+                   , split                              < 0.3
+                   , syb                                < 0.5
+                   , test-framework                     < 0.9
+                   , test-framework-hunit               < 0.4
+                   , test-framework-th                  < 0.3
+                   , text                               < 0.12
+                   , time                               < 1.5
+                   , unordered-containers               < 0.3
+                   , utf8-string                        < 0.4
+                   , vector                             < 0.11
+                   , sourcemap                          < 0.2
 
 executable fay
   hs-source-dirs:    src/main
   ghc-options:       -O2 -Wall
   ghc-prof-options:  -fprof-auto
   main-is:           Main.hs
-  build-depends:     base >= 4 && < 5
+  build-depends:     base
                    , fay
                    , Cabal
                    , aeson
@@ -149,11 +149,11 @@
                    , directory
                    , filepath
                    , ghc-paths
-                   , haskeline
-                   , haskell-src-exts >= 1.14
-                   , language-ecmascript >= 0.15 && < 1.0
+                   , haskeline                          < 0.8
+                   , haskell-src-exts
+                   , language-ecmascript
                    , mtl
-                   , optparse-applicative >= 0.6 && < 0.8
+                   , optparse-applicative >= 0.6     && < 0.8
                    , process
                    , safe
                    , split
@@ -169,7 +169,7 @@
                      Test.Compile
                      Test.Convert
                      Test.Util
-  build-depends:     base >= 4 && < 5
+  build-depends:     base
                    , fay
                    , Cabal
                    , HUnit
@@ -182,10 +182,10 @@
                    , directory
                    , filepath
                    , ghc-paths
-                   , haskell-src-exts >= 1.14
-                   , language-ecmascript >= 0.15 && < 1.0
+                   , haskell-src-exts
+                   , language-ecmascript
                    , mtl
-                   , pretty-show >= 1.6
+                   , pretty-show
                    , process
                    , safe
                    , split
diff --git a/src/Fay/Compiler/Decl.hs b/src/Fay/Compiler/Decl.hs
--- a/src/Fay/Compiler/Decl.hs
+++ b/src/Fay/Compiler/Decl.hs
@@ -74,22 +74,30 @@
 
 -- | Compile a top-level pattern bind.
 compilePatBind :: Bool -> Maybe S.Type -> S.Decl -> Compile [JsStmt]
-compilePatBind toplevel sig pat = case pat of
+compilePatBind toplevel sig patDecl = case patDecl of
   PatBind srcloc (PVar _ ident) Nothing (UnGuardedRhs _ rhs) Nothing ->
     case ffiExp rhs of
       Just formatstr -> case sig of
         Just sig -> compileFFI ident formatstr sig
-        Nothing  -> throwError (FfiNeedsTypeSig pat)
+        Nothing  -> throwError $ FfiNeedsTypeSig patDecl
       _ -> compileUnguardedRhs toplevel srcloc ident rhs
+  -- TODO: Generalize to all patterns
   PatBind srcloc (PVar _ ident) Nothing (UnGuardedRhs _ rhs) (Just bdecls) ->
     compileUnguardedRhs toplevel srcloc ident (Let S.noI bdecls rhs)
-  PatBind _ pat Nothing (UnGuardedRhs _ rhs) _bdecls -> do
-    exp <- compileExp rhs
-    name <- withScopedTmpJsName return
-    [JsIf t b1 []] <- compilePat (JsName name) pat []
-    let err = [throw ("Irrefutable pattern failed for pattern: " ++ prettyPrint pat) (JsList [])]
-    return [JsVar name exp, JsIf t b1 err]
-  _ -> throwError (UnsupportedDeclaration pat)
+  PatBind _ pat Nothing (UnGuardedRhs _ rhs) _bdecls -> case pat of
+    PList {} -> compilePatBind' pat rhs
+    PTuple{} -> compilePatBind' pat rhs
+    PApp  {} -> compilePatBind' pat rhs
+    _        -> throwError $ UnsupportedDeclaration patDecl
+  _ -> throwError $ UnsupportedDeclaration patDecl
+  where
+    compilePatBind' :: S.Pat -> S.Exp -> Compile [JsStmt]
+    compilePatBind' pat rhs = do
+      exp <- compileExp rhs
+      name <- withScopedTmpJsName return
+      [JsIf t b1 []] <- compilePat (JsName name) pat []
+      let err = [throw ("Irrefutable pattern failed for pattern: " ++ prettyPrint pat) (JsList [])]
+      return [JsVar name exp, JsIf t b1 err]
 
 -- | Compile a normal simple pattern binding.
 compileUnguardedRhs :: Bool -> S.X -> S.Name -> S.Exp -> Compile [JsStmt]
