diff --git a/ihaskell.cabal b/ihaskell.cabal
--- a/ihaskell.cabal
+++ b/ihaskell.cabal
@@ -7,7 +7,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.4.0.0
+version:             0.4.1.0
 
 -- A short (one-line) description of the package.
 synopsis:            A Haskell backend kernel for the IPython project.
@@ -54,7 +54,7 @@
   ghc-options: -threaded
   build-depends:       
                        aeson                >=0.6 && < 0.8,
-                       base                 ==4.6.*,
+                       base                 >=4.6 && < 4.8,
                        base64-bytestring    >=1.0,
                        bytestring           >=0.10,
                        cereal               >=0.3,
@@ -64,8 +64,8 @@
                        containers           >=0.5,
                        directory            -any,
                        filepath             -any,
-                       ghc                  ==7.6.*,
-                       ghc-parser           >=0.1.1,
+                       ghc                  ==7.6.* || == 7.8.*,
+                       ghc-parser           >=0.1.2,
                        ghc-paths            ==0.1.*,
                        haskeline            -any,
                        here                 ==1.2.*,
@@ -133,7 +133,7 @@
   -- Other library packages from which modules are imported.
   default-language:    Haskell2010
   build-depends:       
-                       base                 ==4.6.*,
+                       base                 >=4.6 && < 4.8,
                        aeson                >=0.6 && < 0.8,
                        bytestring           >=0.10,
                        cereal               >=0.3,
@@ -141,7 +141,7 @@
                        mono-traversable     ==0.6.0,
                        containers           >=0.5,
                        directory            -any,
-                       ghc                  ==7.6.*,
+                       ghc                  ==7.6.* || == 7.8.*,
                        ihaskell             -any,
                        MissingH             >=1.2,
                        text                 -any,
@@ -155,7 +155,7 @@
   default-language:    Haskell2010
   build-depends:       
                        aeson                >=0.6 && < 0.8,
-                       base                 ==4.6.*,
+                       base                 >=4.6 && < 4.8,
                        base64-bytestring    >=1.0,
                        bytestring           >=0.10,
                        cereal               >=0.3,
@@ -165,7 +165,7 @@
                        containers           >=0.5,
                        directory            -any,
                        filepath             -any,
-                       ghc                  ==7.6.*,
+                       ghc                  ==7.6.* || == 7.8.*,
                        ghc-parser           >=0.1.1,
                        ghc-paths            ==0.1.*,
                        haskeline            -any,
diff --git a/installation/run.sh b/installation/run.sh
--- a/installation/run.sh
+++ b/installation/run.sh
@@ -12,4 +12,9 @@
 
 # Run IPython.
 # Quotes around $@ are necessary to deal properly with spaces.
-ipython "$@" $IHASKELL_IPYTHON_ARGS
+# Only add IHASKELL_IPYTHON_ARGS to notebook.
+if [[ $1 == "notebook" ]]; then
+    ipython "$@" $IHASKELL_IPYTHON_ARGS
+else
+    ipython "$@"
+fi
diff --git a/src/Hspec.hs b/src/Hspec.hs
--- a/src/Hspec.hs
+++ b/src/Hspec.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE QuasiQuotes, OverloadedStrings, ExtendedDefaultRules #-}
+{-# LANGUAGE QuasiQuotes, OverloadedStrings, ExtendedDefaultRules, CPP #-}
 -- Keep all the language pragmas here so it can be compiled separately.
 module Main where
 import Prelude
@@ -500,7 +500,11 @@
 
   it "breaks without data kinds" $
     parses "data X = 3" `like` [
+#if MIN_VERSION_ghc(7, 8, 0)
+      ParseError (Loc 1 10) "Illegal literal in type (use DataKinds to enable): 3"
+#else
       ParseError (Loc 1 10) "Illegal literal in type (use -XDataKinds to enable): 3"
+#endif
     ]
 
   it "parses statements after imports" $ do
diff --git a/src/IHaskell/Eval/Evaluate.hs b/src/IHaskell/Eval/Evaluate.hs
--- a/src/IHaskell/Eval/Evaluate.hs
+++ b/src/IHaskell/Eval/Evaluate.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE DoAndIfThenElse, NoOverloadedStrings, TypeSynonymInstances #-}
+{-# LANGUAGE DoAndIfThenElse, NoOverloadedStrings, TypeSynonymInstances, CPP #-}
 
 {- | Description : Wrapper around GHC API, exposing a single `evaluate` interface that runs
                    a statement, declaration, import, or directive.
@@ -77,9 +77,14 @@
 
 data ErrorOccurred = Success | Failure deriving (Show, Eq)
 
+-- | Enable debugging output
 debug :: Bool
 debug = False
 
+-- | Set GHC's verbosity for debugging
+ghcVerbosity :: Maybe Int
+ghcVerbosity = Nothing -- Just 5
+
 ignoreTypePrefixes :: [String]
 ignoreTypePrefixes = ["GHC.Types", "GHC.Base", "GHC.Show", "System.IO",
                       "GHC.Float", ":Interactive", "GHC.Num", "GHC.IO",
@@ -96,8 +101,12 @@
 
 type Interpreter = Ghc
 
+#if MIN_VERSION_ghc(7, 8, 0)
+   -- GHC 7.8 exports a MonadIO instance for Ghc
+#else
 instance MonadIO.MonadIO Interpreter where
     liftIO = MonadUtils.liftIO
+#endif
 
 globalImports :: [String]
 globalImports =
@@ -115,18 +124,13 @@
 -- is handled specially, which cannot be done in a testing environment.
 interpret :: Bool -> Interpreter a -> IO a
 interpret allowedStdin action = runGhc (Just libdir) $ do
-  initGhci
-
   -- If we're in a sandbox, add the relevant package database
-  dflags <- getSessionDynFlags
   sandboxPackages <- liftIO getSandboxPackageConf
-  let pkgConfs = case sandboxPackages of
-        Nothing -> extraPkgConfs dflags
-        Just path ->
-          let pkg  = PkgConfFile path in
-            (pkg:) . extraPkgConfs dflags
-
-  void $ setSessionDynFlags $ dflags { extraPkgConfs = pkgConfs }
+  initGhci sandboxPackages
+  case ghcVerbosity of
+    Just verb -> do dflags <- getSessionDynFlags
+                    void $ setSessionDynFlags $ dflags { verbosity = verb }
+    Nothing   -> return ()
 
   initializeImports
 
@@ -618,30 +622,8 @@
 evalCommand _ (Directive GetInfo str) state = safely state $ do
   write $ "Info: " ++ str
   -- Get all the info for all the names we're given.
-  names     <- parseName str
-  maybeInfos <- mapM getInfo names
-
-  -- Filter out types that have parents in the same set.
-  -- GHCi also does this.
-  let getType (theType, _, _) = theType
-      infos = catMaybes maybeInfos
-      allNames = mkNameSet $ map (getName . getType) infos
-      hasParent info = case tyThingParent_maybe (getType info) of
-        Just parent -> getName parent `elemNameSet` allNames
-        Nothing -> False
-      filteredOutput = filter (not . hasParent) infos
-
-  -- Convert to textual data.
-  let printInfo (thing, fixity, classInstances) =
-        pprTyThingInContextLoc False thing $$ showFixity fixity $$ vcat (map GHC.pprInstance classInstances)
-        where
-          showFixity fixity =
-            if fixity == GHC.defaultFixity
-            then empty
-            else ppr fixity <+> pprInfixName (getName thing)
+  strings <- getDescription str
 
-  -- Print nicely.
-  strings <- mapM (doc . printInfo) filteredOutput
   let output = case getFrontend state of
         IPythonConsole -> unlines strings
         IPythonNotebook -> unlines (map htmlify strings)
@@ -723,6 +705,9 @@
   let widgetExpr = printf "(IHaskell.Display.Widget (%s))" expr :: String
   isWidget <- attempt $ exprType widgetExpr
 
+  write $ "Can Display: " ++ show canRunDisplay
+  write $ "  Is Widget: " ++ show canRunDisplay
+
   if canRunDisplay
   then do
     -- Use the display. As a result, `it` is set to the output.
@@ -944,7 +929,12 @@
   flip gcatch (unload importedModules) $ do
     -- Compile loaded modules.
     flags <- getSessionDynFlags
+#if MIN_VERSION_ghc(7,8,0)
+    let objTarget = defaultObjectTarget platform
+        platform = targetPlatform flags
+#else
     let objTarget = defaultObjectTarget
+#endif
     setSessionDynFlags flags{ hscTarget = objTarget }
 
     -- Clear old targets to be sure.
@@ -1157,6 +1147,7 @@
     printf "<span class='%s'>%s</span>" cls .
     replace "\n" "<br/>" .
     replace useDashV "" .
+    replace "Ghci" "IHaskell" .
     fixDollarSigns .
     rstrip .
     typeCleaner
diff --git a/src/IHaskell/Eval/Parser.hs b/src/IHaskell/Eval/Parser.hs
--- a/src/IHaskell/Eval/Parser.hs
+++ b/src/IHaskell/Eval/Parser.hs
@@ -175,8 +175,8 @@
     parsers flags =
       [ (Import,        unparser parserImport)
       , (TypeSignature, unparser parserTypeSignature)
-      , (Declaration,   unparser parserDeclaration)
       , (Statement,     unparser parserStatement)
+      , (Declaration,   unparser parserDeclaration)
       ]
       where
         unparser :: Parser a -> String -> ParseOutput String
diff --git a/src/IHaskell/Eval/Util.hs b/src/IHaskell/Eval/Util.hs
--- a/src/IHaskell/Eval/Util.hs
+++ b/src/IHaskell/Eval/Util.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP, NoImplicitPrelude #-}
 module IHaskell.Eval.Util (
   -- * Initialization
   initGhci,
@@ -12,11 +13,14 @@
   evalImport,
   evalDeclarations,
   getType,
+  getDescription,
 
   -- * Pretty printing
   doc,
   ) where
 
+import ClassyPrelude
+
 -- GHC imports.
 import DynFlags
 import FastString
@@ -29,11 +33,13 @@
 import Outputable
 import Packages
 import RdrName
+import NameSet
+import Name
+import PprTyThing
 import qualified Pretty
 
 import Control.Monad (void)
 import Data.Function (on)
-import Data.List (find)
 import Data.String.Utils (replace)
 
 -- | A extension flag that can be set or unset.
@@ -125,18 +131,28 @@
 -- @NoMonomorphismRestriction@), sets the target to interpreted, link in
 -- memory, sets a reasonable output width, and potentially a few other
 -- things. It should be invoked before other functions from this module.
-initGhci :: GhcMonad m => m ()
-initGhci = do
+--
+-- We also require that the sandbox PackageConf (if any) is passed here
+-- as setSessionDynFlags will read the package database the first time
+-- (and only the first time) it is called.
+initGhci :: GhcMonad m => Maybe String -> m ()
+initGhci sandboxPackages = do
   -- Initialize dyn flags.
   -- Start with -XExtendedDefaultRules and -XNoMonomorphismRestriction.
   originalFlags <- getSessionDynFlags
   let flag = flip xopt_set
       unflag = flip xopt_unset
       dflags = flag Opt_ExtendedDefaultRules . unflag Opt_MonomorphismRestriction $ originalFlags
+      pkgConfs = case sandboxPackages of
+        Nothing -> extraPkgConfs originalFlags
+        Just path ->
+          let pkg  = PkgConfFile path in
+            (pkg:) . extraPkgConfs originalFlags
 
   void $ setSessionDynFlags $ dflags { hscTarget = HscInterpreted,
                                        ghcLink = LinkInMemory,
-                                       pprCols = 300 }
+                                       pprCols = 300,
+                                       extraPkgConfs = pkgConfs }
 
 -- | Evaluate a single import statement.
 -- If this import statement is importing a module which was previously
@@ -162,7 +178,8 @@
     -- Check whether an import is the same as another import (same module).
     importOf :: ImportDecl RdrName -> InteractiveImport -> Bool
     importOf _ (IIModule _) = False
-    importOf imp (IIDecl decl) = ((==) `on` (unLoc . ideclName)) decl imp
+    importOf imp (IIDecl decl) = 
+      ((==) `on` (unLoc . ideclName)) decl imp && not (ideclQualified decl)
 
     -- Check whether an import is an *implicit* import of something.
     implicitImportOf :: ImportDecl RdrName -> InteractiveImport -> Bool
@@ -190,3 +207,48 @@
   flags <- getSessionDynFlags
   let typeStr = showSDocUnqual flags $ ppr result
   return typeStr
+
+-- | A wrapper around @getInfo@. Return info about each name in the string.
+getDescription :: GhcMonad m => String -> m [String]
+getDescription str = do
+  names     <- parseName str
+  maybeInfos <- mapM getInfo' names
+
+  -- Filter out types that have parents in the same set.
+  -- GHCi also does this.
+  let infos = catMaybes maybeInfos
+      allNames = mkNameSet $ map (getName . getType) infos
+      hasParent info = case tyThingParent_maybe (getType info) of
+        Just parent -> getName parent `elemNameSet` allNames
+        Nothing -> False
+      filteredOutput = filter (not . hasParent) infos
+
+  -- Print nicely
+  mapM (doc . printInfo) filteredOutput
+  where
+#if MIN_VERSION_ghc(7,8,0)
+    getInfo' = getInfo False
+#else
+    getInfo' = getInfo
+#endif
+
+#if MIN_VERSION_ghc(7,8,0)
+    getType (theType, _, _, _) = theType
+#else
+    getType (theType, _, _) = theType
+#endif
+
+#if MIN_VERSION_ghc(7,8,0)
+    printInfo (thing, fixity, classInstances, famInstances) =
+          pprTyThingInContextLoc thing $$
+          showFixity thing fixity $$
+          vcat (map GHC.pprInstance classInstances) $$
+          vcat (map GHC.pprFamInst famInstances)
+#else
+    printInfo (thing, fixity, classInstances) =
+          pprTyThingInContextLoc False thing $$ showFixity thing fixity $$ vcat (map GHC.pprInstance classInstances)
+#endif
+    showFixity thing fixity =
+      if fixity == GHC.defaultFixity
+      then empty
+      else ppr fixity <+> pprInfixName (getName thing)
diff --git a/src/IHaskell/IPython.hs b/src/IHaskell/IPython.hs
--- a/src/IHaskell/IPython.hs
+++ b/src/IHaskell/IPython.hs
@@ -183,12 +183,13 @@
       case parseVersion output of
         Just (2:_) -> putStrLn "Using system-wide IPython."
         Just (1:_) -> badIPython "Detected old version of IPython. IHaskell requires 2.0.0 or up."
-        Nothing -> badIPython "Detected IPython, but could not parse version number."
+        Just (0:_) -> badIPython "Detected old version of IPython. IHaskell requires 2.0.0 or up."
+        _ -> badIPython "Detected IPython, but could not parse version number."
 
     badIPython :: Text -> IO ()
     badIPython reason = void $ do
         putStrLn reason
-        putStrLn "IHaskell will not proceed to install IPython (locally for itself)."
+        putStrLn "IHaskell will now proceed to install IPython (locally for itself)."
         putStrLn "Installing IPython in IHaskell's virtualenv in 10 seconds. Ctrl-C to cancel."
         threadDelay $ 1000 * 1000 * 10
         installIPython
