 	}
 
 	func testDatatypeDeclarationsAddDataConstructorsToEnvironment() {
-		assert(Expression<Term>.boolean.environment["true"], ==, .Product(true, .Unit))
-		assert(Expression<Term>.boolean.environment["false"], ==, .Product(false, .Unit))
+		assert(Expression<Term>.boolean.environment["true"], ==, .Annotation(.Product(true, .Unit), "Boolean"))
+		assert(Expression<Term>.boolean.environment["false"], ==, .Annotation(.Product(false, .Unit), "Boolean"))
 	}
 
 	func testDatatypeConstructorsProduceRightNestedValues() {
-		assert(selfModule.environment["me"], ==, .Product(true, .Unit))
-		assert(selfModule.environment["myself"], ==, .Product(false, .Product(true, .Unit)))
-		assert(selfModule.environment["I"], ==, .Product(false, .Product(false, .Unit)))
+		assert(selfModule.environment["me"], ==, .Annotation(.Product(true, .Unit), "Self"))
+		assert(selfModule.environment["myself"], ==, .Annotation(.Product(false, .Product(true, .Unit)), "Self"))
+		assert(selfModule.environment["I"], ==, .Annotation(.Product(false, .Product(false, .Unit)), "Self"))
 	}
 
 	func testDatatypeConstructorWithArgumentsHasFunctionType() {

	}

	func testDatatypeConstructorWithArgumentsProducesFunction() {
		assert(oneConstructorWithArgumentModule.environment["a"], ==, .lambda(.BooleanType, { .Product($0, .Unit) }))
	}

	func testDatatypeConstructorsWithArgumentsHaveFunctionTypes() {

	}

	func testDatatypeConstructorsWithArgumentsProduceFunctionsReturningRightNestedValues() {
		assert(multipleConstructorsWithArgumentsModule.environment["a"], ==, .lambda(.BooleanType, { .Annotation(.Product(true, .Product($0, .Unit)), "A") }))
		assert(multipleConstructorsWithArgumentsModule.environment["b"], ==, .lambda(.BooleanType, { .Annotation(.Product(false, .Product(true, .Product($0, .Unit))), "A") }))
		assert(multipleConstructorsWithArgumentsModule.environment["c"], ==, .lambda(.BooleanType, { .Annotation(.Product(false, .Product(false, .Product($0, .Unit))), "A") }))
	}

	func testDatatypeConstructorsWithRecursiveReferencesProduceValuesEmbeddingReferencesToTheirType() {
		assert(Expression<Term>.natural.environment["successor"], ==, Expression.lambda("Natural") { .Annotation(.Product(false, .Product($0, .Unit)), "Natural") })
	}

	func testDatatypeConstructorsWithMultipleArgumentsHaveFunctionTypes() {
