At the end of the meeting yesterday, Danny asked about using a divergence judgment along with big-step "evaluation dynamics". This was called coinductive big-step semantics here:
http://gallium.inria.fr/~xleroy/coindsem/"Coinductive" because the divergence judgment is defined coinductively. The paper linked to from the link above explains coinductive judgments. It shows a form of type safety that can be proven using coinductive big-step semantics and discusses the pros and cons. (It says other things too.)
Relevant future PFPL chapters for paper:
8: Functions
20: Recursive Types (But this is isorecursive types, while paper uses a cheaty form of equirecursive types.)
21: Untyped lambda-Calculus (for fixed point combinators)
22: Dynamic Typing (Most of the paper uses a dynamically-typed lambda calculus.)
25: Behavioral Typing (The paper's type safety section concerns a Curry-style system, and behavioral typing seems to be the closest thing PFPL discusses.)
I'm not saying you need to understand all those chapters before you can understand the paper though.
People keep (re)inventing styles of operational semantics. I kind of like definitional interpreters, but hardly anyone even mentions them. The "denotational semantics" in section 5 of the paper is really more of an interpreter, and I consider it a form of operational semantics. I have (re)discovered that this sort of definitional interpreter is amenable to direct statements and proofs of type safety.
Another form of big-step semantics that properly distinguishes between unsafe and nonterminating programs is clocked big-step semantics:
https://cakeml.org/popl14.pdf (Section 7)
Basically, add a natural number "clock" to the judgement, which counts down in enough places, and have a fake "timed-out" result if evaluation runs out of time. Nonterminating programs time out no matter how much time you give them.