Status and StatusValue, if we ignore their capacity to store error messages, are basically generic containers. $status = Status::newGood( $foo ) creates a container wrapping $foo, and $status->getValue() returns the same $foo. This is unfortunately not known to IDEs and static analysis tools, which will have no type information for $foo, and so e.g. PhpStorm will not autocomplete method calls, while Phan will not warn about using non-existent methods.
This requires us to annotate types explicitly (e.g. here or here, just two random examples), and when we want to avoid that, it instead leads us to implement unnecessary concrete subclasses (e.g. TempUser\CreateStatus, also see T358492).
The PHP ecosystem has some fairly consistent conventions to solve this, using @template PHPDoc annotations, although if there is an authoritative documentation for their formats, I did not find it – every IDE and static analysis tool seems to just wing it.
While we don't seem to use @template almost anywhere (2 results here: https://codesearch.wmcloud.org/search/?q=%40template&files=php), we actually annotate uses of Status with generic parameters fairly often: https://codesearch.wmcloud.org/search/?q=%40.%2B\b(Status|StatusValue)<&files=php (this doesn't help any IDEs or static analysis tools without the @template annotations, but it helps human readers).
I tried applying them to Status and StatusValue, and I got things working like I wanted in PhpStorm, but not in Phan – apparently, when a class is annotated to be generic but it's used in a return type without filling in the generic parameters, the type parameter leaks out and causes spurious errors everywhere. Since we annotate lots of things with @return Status instead of @return Status<Foo>, this makes it impossible to gradually introduce better typing. I filed this as a bug as https://github.com/phan/phan/issues/4982.
Getting this done will probably result in some Phan errors in various extensions (either real issues or false positives), but I think it's worth it. Hopefully it can become a common convention for other code later.