Postgres doesn't support unsigned ints last I looked, so it's actually a ~2 billion limit.
Secondly, it's not XXXk rows currently-you have to consider the complete lifetime of the table. When rows are deleted/created and how often.
So what you've said is true, but the set of appropriateness for smallint is a much smaller than expected.