D’oh.
I fixed it, but I’ll leave this question in case others have similar problems.
When copy/pasting various options into wp-config.php I accidentally included this setting, which I don’t normally use:
// Overkill but FYI: disallows installation/updating of any theme or plugin
define('DISALLOW_FILE_MODS',true);
That produces the described problem, albeit by design.