It's because of this language at the beginning of chapter 4 in the spec:

"There is a restriction on forward references in blocks: In a statement
sequence s1 . . . sn making up a block, if a simple name in si refers to
an entity defined by sj where j >= i, then none of the definitions
between and including si and sj may be a value or variable definition."

And that's a good thing, of course! But what language in the spec
justifies it? Section 5.2 says how "lazy" behaves at runtime, but it
doesn't say anything about there being an exception to the chapter 4
rule at compile time. After all, "lazy val" is still technically a
value definition.