diff --git a/src/core/PaperScope.js b/src/core/PaperScope.js
index 85289c32..481b92a8 100644
--- a/src/core/PaperScope.js
+++ b/src/core/PaperScope.js
@@ -120,7 +120,7 @@ var PaperScope = Base.extend(/** @lends PaperScope# */{
 	 */
 
 	evaluate: function(code) {
-		var res = PaperScript.evaluate(code, this);
+		var res = paper.PaperScript.evaluate(code, this);
 		View.updateFocus();
 		return res;
 	},
diff --git a/src/core/PaperScript.js b/src/core/PaperScript.js
index c7aef9ed..9210e419 100644
--- a/src/core/PaperScript.js
+++ b/src/core/PaperScript.js
@@ -14,16 +14,19 @@
  * @name PaperScript
  * @namespace
  */
+// Note that due to the use of with(), PaperScript gets compiled outside the
+// main paper scope, and is added to the PaperScope class. This allows for
+// better minification and the future use of strict mode once it makes sense
+// in terms of performance.
+paper.PaperScope.prototype.PaperScript = new function() {
+	// Locally override define, so acorn.js does not export itself
+	var define = null;
+	/*#*/ if (options.parser == 'acorn') {
+	/*#*/ include('../../lib/acorn-min.js');
+	/*#*/ } else if (options.parser == 'esprima') {
+	/*#*/ include('../../lib/esprima-min.js');
+	/*#*/ }
 
-// Locally override define, so acorn.js does not export itself
-var define = null;
-/*#*/ if (options.parser == 'acorn') {
-/*#*/ include('../../lib/acorn-min.js');
-/*#*/ } else if (options.parser == 'esprima') {
-/*#*/ include('../../lib/esprima-min.js');
-/*#*/ }
- 
-var PaperScript = new function() {
 	// Operators to overload
 
 	var binaryOperators = {
@@ -230,7 +233,7 @@ var PaperScript = new function() {
 				// Only look for tool handlers if something resembling their
 				// name is contained in the code.
 				if (/on(?:Key|Mouse)(?:Up|Down|Move|Drag)/.test(code)) {
-					Base.each(Tool.prototype._events, function(key) {
+					Base.each(paper.Tool.prototype._events, function(key) {
 						var value = eval(key);
 						if (value) {
 							// Use the getTool accessor that handles auto tool
@@ -273,7 +276,8 @@ var PaperScript = new function() {
 	}
 
 	function load() {
-		var scripts = document.getElementsByTagName('script');
+		var scripts = document.getElementsByTagName('script'),
+			PaperScope = paper.PaperScope;
 		for (var i = 0, l = scripts.length; i < l; i++) {
 			var script = scripts[i];
 			// Only load this script if it not loaded already.
@@ -313,7 +317,7 @@ var PaperScript = new function() {
 		// Handle it asynchronously
 		setTimeout(load);
 	} else {
-		DomEvent.add(window, { load: load });
+		paper.DomEvent.add(window, { load: load });
 	}
 
 	return {
diff --git a/src/export.js b/src/export.js
index abc438ed..541be03c 100644
--- a/src/export.js
+++ b/src/export.js
@@ -10,12 +10,13 @@
  * All rights reserved.
  */
 
-// First add Base, PaperScript and Numerical to exports, then inject all exports
-// into PaperScope, and create the initial paper object, all in one statement:
+// First add Base and Numerical to exports, then inject all exports into
+// PaperScope, and create the initial paper object, all in one statement:
 paper = new (PaperScope.inject(Base.merge(Base.exports, {
 	// Mark fields as enumeralbe so PaperScope.inject can pick them up
 	enumerable: true,
 	Base: Base,
-	PaperScript: PaperScript,
-	Numerical: Numerical
+	Numerical: Numerical,
+	DomElement: DomElement,
+	DomEvent: DomEvent
 })))();
diff --git a/src/paper.js b/src/paper.js
index fc5de717..c86c4229 100644
--- a/src/paper.js
+++ b/src/paper.js
@@ -124,12 +124,14 @@ var paper = new function() {
 /*#*/ include('svg/SVGImport.js');
 /*#*/ } // options.svg
 
-/*#*/ include('core/PaperScript.js');
-
 /*#*/ include('export.js');
 return paper;
 };
 
+// include PaperScript separately outside the main paper scope, due to its use
+// of with(). This also simplifies making its inclusion optional.
+/*#*/ include('core/PaperScript.js');
+
 // Support AMD (e.g. require.js)
 if (typeof define === 'function' && define.amd)
 	define(paper);