diff --git a/lib/src/lambda_context.dart b/lib/src/lambda_context.dart
index 5a8aa2e..13f8f6a 100644
--- a/lib/src/lambda_context.dart
+++ b/lib/src/lambda_context.dart
@@ -28,7 +28,7 @@
   /// result as a string.
   String renderString({Object value}) {
     _checkClosed();
-    if (_node is! _SectionNode) _error(
+    if (_node is! SectionNode) _error(
         'LambdaContext.renderString() can only be called on section tags.');
     var sink = new StringBuffer();
     _renderSubtree(sink, value);
@@ -37,14 +37,14 @@
 
   void _renderSubtree(StringSink sink, Object value) {
     var ctx = new RenderContext.subtree(_context, sink);
-    _SectionNode section = _node;
+    SectionNode section = _node;
     if (value != null) ctx.push(value);
     renderWithContext(ctx, section.children);
   }
   
   void render({Object value}) {
     _checkClosed();
-    if (_node is! _SectionNode) _error(
+    if (_node is! SectionNode) _error(
         'LambdaContext.render() can only be called on section tags.');
     _renderSubtree(_context._sink, value);
   }
@@ -58,13 +58,13 @@
   String get source {
     _checkClosed();
     
-    if (_node is! _SectionNode) return '';
+    if (_node is! SectionNode) return '';
     
-    var nodes = (_node as _SectionNode).children;
+    var nodes = (_node as SectionNode).children;
     
     if (nodes.isEmpty) return '';
     
-    if (nodes.length == 1 && nodes.first is _TextNode)
+    if (nodes.length == 1 && nodes.first is TextNode)
       return nodes.first.text;
     
     var source = _context.source.substring(
@@ -80,8 +80,8 @@
     
     // Lambdas used for sections should parse with the current delimiters.
     var delimiters = '{{ }}';
-    if (_node is _SectionNode) {
-      _SectionNode node = _node;
+    if (_node is SectionNode) {
+      SectionNode node = _node;
       delimiters = node.delimiters;
     }
     
diff --git a/lib/src/node.dart b/lib/src/node.dart
index 62b8b8b..20b9ece 100644
--- a/lib/src/node.dart
+++ b/lib/src/node.dart
@@ -15,7 +15,7 @@
     }
         
     var node = nodes.last;
-    if (node is _TextNode) {
+    if (node is TextNode) {
       node.render(ctx, lastNode: true);
     } else {
       node.render(ctx);
@@ -41,9 +41,9 @@
 }
 
 
-class _TextNode extends Node {
+class TextNode extends Node {
   
-  _TextNode(this.text, int start, int end) : super(start, end);
+  TextNode(this.text, int start, int end) : super(start, end);
   
   final String text;
   
@@ -62,9 +62,9 @@
   }
 }
 
-class _VariableNode extends Node {
+class VariableNode extends Node {
   
-  _VariableNode(this.name, int start, int end, {this.escape: false})
+  VariableNode(this.name, int start, int end, {this.escape: false})
     : super(start, end);
   
   final String name;
@@ -125,9 +125,9 @@
 }
 
 
-class _SectionNode extends Node {
+class SectionNode extends Node {
   
-  _SectionNode(this.name, int start, int end, this.delimiters,
+  SectionNode(this.name, int start, int end, this.delimiters,
       {this.inverse: false})
     : super(start, end);
   
@@ -216,9 +216,9 @@
   }
 }
 
-class _PartialNode extends Node {
+class PartialNode extends Node {
 
-  _PartialNode(this.name, int start, int end, this.indent)
+  PartialNode(this.name, int start, int end, this.indent)
     : super(start, end);
   
   final String name;
diff --git a/lib/src/parse.dart b/lib/src/parse.dart
index a147ce4..5748a66 100644
--- a/lib/src/parse.dart
+++ b/lib/src/parse.dart
@@ -13,26 +13,26 @@
   tokens = _removeStandaloneWhitespace(tokens);
   tokens = _mergeAdjacentText(tokens);
   
-  var stack = new List<Node>()..add(new _SectionNode('root', 0, 0, delimiters));
+  var stack = new List<Node>()..add(new SectionNode('root', 0, 0, delimiters));
 
   var delim;
   
   for (var t in tokens) {
     switch (t.type) {
       case _TEXT:
-        var n = new _TextNode(t.value, t.start, t.end);
+        var n = new TextNode(t.value, t.start, t.end);
         stack.last.children.add(n);
         break;
         
       case _VARIABLE:
       case _UNESC_VARIABLE:
-        var n = new _VariableNode(
+        var n = new VariableNode(
             t.value, t.start, t.end, escape: t.type != _UNESC_VARIABLE);
         stack.last.children.add(n);
         break;
 
       case _PARTIAL:
-        var n = new _PartialNode(t.value, t.start, t.end, t.indent); 
+        var n = new PartialNode(t.value, t.start, t.end, t.indent); 
         stack.last.children.add(n);
         break;
 
@@ -40,7 +40,7 @@
       case _OPEN_INV_SECTION:
         // Store the start, end of the inner string content not
         // including the tag.
-        var child = new _SectionNode(t.value, t.start, t.end, delim, 
+        var child = new SectionNode(t.value, t.start, t.end, delim, 
             inverse: t.type == _OPEN_INV_SECTION)
             ..contentStart = t.end;
         stack.last.children.add(child);
