Let's try an expression that diverges (never terminates) in the untyped lambda calculus:

scala> type x = App[Lam[App[X, X]], Lam[App[X, X]]]#Eval :8: error: illegal cyclic reference involving type Eval

That's Scala 2.7.4. It figures out that we're trying to construct an infinite type. Hurray! But that also means it's not Turing-equivalent. There will be other, legitimate types that it can't check either.

Try the same thing in 2.8 and you get...

Exception in thread "main" java.lang.StackOverflowError at scala.tools.nsc.symtab.Symbols$Symbol.isPackageClass(Symbols.scala:407) at scala.tools.nsc.symtab.Types$Type.isGround(Types.scala:640) at scala.tools.nsc.symtab.Types$Type.isGround(Types.scala:640) at scala.tools.nsc.symtab.Types$Type.isGround(Types.scala:640) at scala.tools.nsc.symtab.Types$Type.isGround(Types.scala:640) at scala.tools.nsc.symtab.Types$Type.isGround(Types.scala:638) at scala.tools.nsc.symtab.Types$Type$$anonfun$isGround$1.apply(Types.scala:638) at scala.tools.nsc.symtab.Types$Type$$anonfun$isGround$1.apply(Types.scala:638) at scala.collection.generic.LinearSequenceTemplate$class.forall(LinearSequenceTemplate.scala:97) at scala.collection.immutable.List.forall(List.scala:27)

...which is what you would expect. So it looks like typechecking in 2.8 has become undecidable in general. But don't fret. You really have to try hard to get this kind of result.

Data types such as the Church numerals and Booleans can be encoded in this calculus. I might post those a bit later.

Scala rocks.