É uma prática / design ruim de codificação criar uma classe que será instanciada apenas uma vez?
Não, mesmo que apenas instanciado uma vez, você precisa de uma classe para isso. Mas não pense que você sempre precisará apenas de uma instância, agora e no futuro.
Suponha que você faça um jogo e tenha uma classe de jogadores:
class Player {
...
}
Você instancia uma classe de jogador no seu jogo e usa sempre o mesmo objeto. Nada de errado com isso.
No entanto, não faça dele um Singleton! Hoje você cria seu jogo e pensa: "Bem, sempre será um jogo para um jogador. Vou usar um Singleton para meu jogador". Mas na versão 2, você pode implementar o modo multiplayer - e então está enfrentando problemas. Você precisará reescrever e adaptar muito código, porque seu design não suporta instanciar vários players.
O mesmo é com caches. Ou madeireiros. Ou interfaces de rede. Hoje, você acha que precisará apenas de um, sempre, com certeza. Mas em uma versão futura você precisará adicionar um segundo. Esteja ciente desta situação.