diff --git a/configure.ac b/configure.ac
index 09e292e1b16f925560a65a81164d6c888c4ac432..54a251b2363fa60c2f55aac2d01156e43f5beb8a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -35,6 +35,7 @@ AC_CONFIG_FILES([Makefile
    src/nix-store/Makefile
    src/nix-hash/Makefile
    src/libexpr/Makefile
+   src/nix-instantiate/Makefile
    scripts/Makefile
    corepkgs/Makefile
    corepkgs/fetchurl/Makefile
diff --git a/src/Makefile.am b/src/Makefile.am
index f06bb1f1d818e65a99aa573c04c59bc081a92dab..fe8cbf1e32838867f16d09002e979ff0e6d44ad0 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,2 +1,2 @@
 SUBDIRS = bin2c boost libutil libstore libmain nix-store nix-hash \
- libexpr #nix-instantiate
+ libexpr nix-instantiate
diff --git a/src/libexpr/Makefile.am b/src/libexpr/Makefile.am
index 6fe79850116ea37c9ed421e77acf52d4deea012a..71c1f89f1dcd856d35cbfea080d09031c21bd3c2 100644
--- a/src/libexpr/Makefile.am
+++ b/src/libexpr/Makefile.am
@@ -1,12 +1,9 @@
-bin_PROGRAMS = nix-instantiate
+noinst_LIBRARIES = libexpr.a
 
-nix_instantiate_SOURCES = nixexpr.cc parser.cc eval.cc primops.cc main.cc
-nix_instantiate_LDADD = ../libmain/libmain.a ../libstore/libstore.a ../libutil/libutil.a \
- ../boost/format/libformat.a -L../../externals/inst/lib -ldb_cxx \
- -lsglr -lATB -lconversion -lasfix2 -lmept -lATerm
+libexpr_a_SOURCES = nixexpr.cc parser.cc eval.cc primops.cc
 
 AM_CXXFLAGS = \
- -I.. -I../../externals/inst/include -I../libutil -I../libstore -I../libmain
+ -I.. -I../../externals/inst/include -I../libutil -I../libstore
 
 
 # Parse table generation.
diff --git a/src/libexpr/parser.cc b/src/libexpr/parser.cc
index b2c74af33e77e0dab1e252ad7e38bef2e15877d4..22d76c263ac6a91832457cc0af885c4d0855193f 100644
--- a/src/libexpr/parser.cc
+++ b/src/libexpr/parser.cc
@@ -12,7 +12,6 @@ extern "C" {
 
 #include "aterm.hh"
 #include "parser.hh"
-#include "shared.hh"
 #include "parse-table.h"
 
 
@@ -100,8 +99,7 @@ Expr parseExprFromFile(Path path)
 
         ATprotect(&lang);
         lang = ATmake("Nix");
-        if (!SGopenLanguageFromTerm(
-                (char *) programId.c_str(), lang, parseTable))
+        if (!SGopenLanguageFromTerm("nix-parse", lang, parseTable))
             throw Error(format("cannot open language"));
 
         SG_STARTSYMBOL_ON();
diff --git a/src/nix-instantiate/Makefile.am b/src/nix-instantiate/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..91843f66341b7a1767a5507f2b2190718aa2aec8
--- /dev/null
+++ b/src/nix-instantiate/Makefile.am
@@ -0,0 +1,11 @@
+bin_PROGRAMS = nix-instantiate
+
+nix_instantiate_SOURCES = main.cc
+nix_instantiate_LDADD = ../libmain/libmain.a ../libexpr/libexpr.a \
+ ../libstore/libstore.a ../libutil/libutil.a \
+ ../boost/format/libformat.a -L../../externals/inst/lib -ldb_cxx \
+ -lsglr -lATB -lconversion -lasfix2 -lmept -lATerm
+
+AM_CXXFLAGS = \
+ -I.. -I../../externals/inst/include -I../libutil -I../libstore \
+ -I../libexpr -I../libmain
diff --git a/src/libexpr/main.cc b/src/nix-instantiate/main.cc
similarity index 100%
rename from src/libexpr/main.cc
rename to src/nix-instantiate/main.cc