diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -130,9 +130,9 @@
 Write a `default.nix` (this will fetch a recent version of `miso`). `miso` will provide you with a working `nixpkgs` named `pkgs`. `callCabal2nix` will automatically produce a nix expression that builds your cabal file.
 
 ```nix
-with (import (builtins.fetchTarball {
-  url = "https://github.com/dmjio/miso/archive/ea25964565074e73d4052b56b60b6e101fa08bc5.tar.gz";
-  sha256 = "1yb9yvc0ln4yn1jk2k5kwwa1s32310abawz40yd8cqqkm1z7w6wg";
+with (import (builtins.fetchGit {
+  url = "https://github.com/dmjio/miso";
+  ref = "refs/tags/1.8";
 }) {});
 pkgs.haskell.packages.ghcjs.callCabal2nix "app" ./. {}
 ```
diff --git a/exe/Main.hs b/exe/Main.hs
deleted file mode 100644
--- a/exe/Main.hs
+++ /dev/null
@@ -1,66 +0,0 @@
--- | Haskell language pragma
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE RecordWildCards #-}
-{-# LANGUAGE CPP #-}
-
--- | Haskell module declaration
-module Main where
-
--- | Miso framework import
-import Miso
-import Miso.String
-
-import Control.Monad.IO.Class
-
-#ifdef IOS
-import Language.Javascript.JSaddle.WKWebView as JSaddle
-
-runApp :: JSM () -> IO ()
-runApp = JSaddle.run
-#else
-import Language.Javascript.JSaddle.Warp as JSaddle
-
-runApp :: JSM () -> IO ()
-runApp = JSaddle.run 8080
-#endif
-
--- | Type synonym for an application model
-type Model = Int
-
--- | Sum type for application events
-data Action
-  = AddOne
-  | SubtractOne
-  | NoOp
-  | SayHelloWorld
-  deriving (Show, Eq)
-
--- | Entry point for a miso application
-main :: IO ()
-main = runApp $ miso $ \_ -> App {..}
-  where
-    initialAction = SayHelloWorld -- initial action to be executed on application load
-    model  = 0                    -- initial model
-    update = updateModel          -- update function
-    view   = viewModel            -- view function
-    events = defaultEvents        -- default delegated events
-    subs   = []                   -- empty subscription list
-    mountPoint = Nothing          -- mount point for application (Nothing defaults to 'body')
-    logLevel = Off                -- Used to copy DOM into VDOM, applies only to `miso` function
-
--- | Updates model, optionally introduces side effects
-updateModel :: Action -> Model -> Effect Action Model
-updateModel AddOne m = noEff (m + 1)
-updateModel SubtractOne m = noEff (m - 1)
-updateModel NoOp m = noEff m
-updateModel SayHelloWorld m = m <# do
-  liftIO (putStrLn "Hello World") >> pure NoOp
-
--- | Constructs a virtual DOM from a model
-viewModel :: Model -> View Action
-viewModel x = div_ [] [
-   button_ [ onClick AddOne ] [ text "+" ]
- , text (ms x)
- , button_ [ onClick SubtractOne ] [ text "-" ]
- , rawHtml "<div><p>hey expandable!</div></p>"
- ]
diff --git a/jsbits/delegate.js b/jsbits/delegate.js
--- a/jsbits/delegate.js
+++ b/jsbits/delegate.js
@@ -106,7 +106,7 @@
 
   /* If obj is a list-like object */
   var newObj;
-  if (obj instanceof Array) {
+  if (obj instanceof Array || ('length' in obj && obj['localName'] !== 'select')) {
     newObj = [];
     for (var i = 0; i < obj.length; i++)
       newObj.push(window['objectToJSON']([], obj[i]));
@@ -115,15 +115,26 @@
 
   /* If obj is a non-list-like object */
   newObj = {};
-  var isInput = obj['localName'] === 'input';
-  for (var i in obj){
+  for (var i in getAllPropertyNames(obj)){
     /* bug in safari, throws TypeError if the following fields are referenced on a checkbox */
     /* https://stackoverflow.com/a/25569117/453261 */
     /* https://html.spec.whatwg.org/multipage/input.html#do-not-apply */
-    if (isInput && (i === 'selectionDirection' || i === 'selectionStart' || i === 'selectionEnd'))
+    if ((obj['localName'] === 'input') && (i === 'selectionDirection' || i === 'selectionStart' || i === 'selectionEnd'))
       continue;
     if (typeof obj[i] == 'string' || typeof obj[i] == 'number' || typeof obj[i] == 'boolean')
       newObj[i] = obj[i];
   }
   return newObj;
+};
+
+/* get static and dynamic properties */
+function getAllPropertyNames(obj) {
+    var props = {}, i = 0;
+    do {
+	var names = Object.getOwnPropertyNames(obj);
+	for (i = 0; i < names.length; i++) {
+	  props [names[i]] = null;
+	}
+    } while (obj = Object.getPrototypeOf(obj));
+  return props;
 };
diff --git a/miso.cabal b/miso.cabal
--- a/miso.cabal
+++ b/miso.cabal
@@ -1,5 +1,5 @@
 name:                miso
-version:             1.8.0.0
+version:             1.8.1.0
 category:            Web, Miso, Data Structures
 license:             BSD3
 license-file:        LICENSE
@@ -38,37 +38,6 @@
   description:
     Cross compile to iOS
 
-executable simple
-  main-is:
-    Main.hs
-  if !impl(ghcjs) && !flag(jsaddle)
-    buildable: False
-  else
-    ghcjs-options:
-      -dedupe
-    cpp-options:
-      -DGHCJS_BROWSER
-    hs-source-dirs:
-      exe
-    build-depends:
-      aeson,
-      base < 5,
-      containers,
-      miso,
-      transformers
-    default-language:
-      Haskell2010
-    if flag(ios)
-      cpp-options:
-        -DIOS
-      ghc-options:
-        -threaded
-      build-depends:
-        jsaddle-wkwebview
-    else
-      build-depends:
-        jsaddle-warp
-
 executable tests
   main-is:
     Main.hs
@@ -140,18 +109,26 @@
     Miso.Svg.Attribute
     Miso.Svg.Element
     Miso.Svg.Event
-    Miso.TypeLevel
     Miso.Types
     Miso.Mathml
     Miso.Mathml.Element
     Miso.String
     Miso.WebSocket
+  if !impl(ghcjs)
+    exposed-modules:
+      Miso.TypeLevel
   other-modules:
     Miso.Concurrent
   ghc-options:
     -Wall
   hs-source-dirs:
     src
+  if impl(ghcjs)
+    hs-source-dirs:
+      ghcjs-src
+  else
+    hs-source-dirs:
+      ghc-src
   build-depends:
     aeson,
     base < 5,
@@ -164,39 +141,25 @@
     lucid,
     network-uri,
     servant,
-    servant-lucid,
     tagsoup,
     text,
     transformers
-  if impl(ghcjs) || flag (jsaddle)
-    if impl(ghcjs)
-      build-depends:
-        ghcjs-base
-    if flag(jsaddle)
-      if flag (ios)
-        cpp-options:
-          -DIOS
-    else
-      js-sources:
-        jsbits/diff.js
-        jsbits/delegate.js
-        jsbits/isomorphic.js
-        jsbits/util.js
+  if impl(ghcjs)
     build-depends:
-      containers,
-      scientific,
-      unordered-containers,
-      transformers,
-      vector
+      ghcjs-base
   else
     build-depends:
-      vector
+      servant-lucid
+  if impl(ghcjs) || flag (jsaddle)
+    if flag (ios)
+      cpp-options:
+        -DIOS
   if impl(ghcjs)
-    hs-source-dirs:
-      ghcjs-src
-  else
-    hs-source-dirs:
-      ghc-src
+    js-sources:
+      jsbits/diff.js
+      jsbits/delegate.js
+      jsbits/isomorphic.js
+      jsbits/util.js
 
 source-repository head
    type: git
diff --git a/src/Miso.hs b/src/Miso.hs
--- a/src/Miso.hs
+++ b/src/Miso.hs
@@ -26,7 +26,9 @@
   , module Miso.Event
   , module Miso.Html
   , module Miso.Subscription
+#ifndef __GHCJS__
   , module Miso.TypeLevel
+#endif
   , module Miso.Types
   , module Miso.Router
   , module Miso.Util
@@ -65,7 +67,9 @@
 import           Miso.Html
 import           Miso.Router
 import           Miso.Subscription
+#ifndef __GHCJS__
 import           Miso.TypeLevel
+#endif
 import           Miso.Types
 import           Miso.Util
 import           Miso.WebSocket
diff --git a/src/Miso/Html/Types.hs b/src/Miso/Html/Types.hs
--- a/src/Miso/Html/Types.hs
+++ b/src/Miso/Html/Types.hs
@@ -40,7 +40,7 @@
     , onBeforeDestroyed
     ) where
 
-import           Control.Monad              (forM_, (<=<), guard)
+import           Control.Monad              (forM_, (<=<))
 import           Control.Monad.IO.Class     (liftIO)
 import           Data.Aeson                 (ToJSON, Value, toJSON)
 import qualified Data.Aeson                 as A
