Melhor maneira de retornar sinalizador de status e mensagem de um método em Java

Eu tenho um cenário enganosamente simples e quero uma solução simples, mas não é óbvio o que é "mais correto" ou "mais Java".

Digamos que eu tenha um método pequeno de autenticação (cliente cliente) em alguma classe. A autenticação pode falhar por vários motivos, e eu quero retornar um booleano simples para o fluxo de controle, mas também retornar uma mensagem String para o usuário. Estas são as possibilidades em que consigo pensar:

Retorne um booleano e passe um StringBuilder para coletar a mensagem. Esta é a maneira mais próxima de fazê-lo no estilo C.Lance uma exceção em vez de retornar falso e inclua a mensagem. Não gosto disso, pois o fracasso não é excepcional.Crie uma nova classe chamada AuthenticationStatus com o booleano e a String. Isso parece exagero para um método pequeno.Armazene a mensagem em uma variável de membro. Isso introduziria uma condição potencial de corrida, e não gosto que isso implique algum estado que não esteja realmente lá.

Alguma outra sugestão?

Editar Perdeu esta opção

Retornar nulo para o sucesso - isso não é seguro?

Editar Solução:

Fui para a solução mais OO e criei uma pequena classe AuthenticationResult. Eu não faria isso em nenhuma outra linguagem, mas gosto em Java. Também gostei da sugestão de retornar um String [], pois é como o retorno nulo, mas mais seguro. Uma vantagem da classe Result é que você pode receber uma mensagem de sucesso com mais detalhes, se necessário.