null, false and true as standalone types

false had been usable only as part of a union since 8.0, and null and true could not be written at all.

// 8.2
function alwaysFails(): false { return false; }
function alwaysNull(): null { return null; }
function alwaysTrue(): true { return true; }

// the case this is actually for: narrowing a return type
// in a subclass, where the parent returns bool
class Base   { public function isValid(): bool { /* ... */ } }
class Always extends Base
{
    public function isValid(): true { return true; }
}

Narrowing a return type in a subclass is the legitimate use and it is genuinely useful to an analyser — a caller with a concrete type knows the branch is unreachable. Using it on a standalone function is nearly always a sign that the return value carries no information and the function should return void or throw. null as a standalone type is the least useful of the three and exists for completeness.