Eu não focaria nos objetos do mundo real e também não focaria nas mensagens. Em vez disso, um exemplo que usei é em gráficos, onde você deseja ter objetos que "sabem como se desenhar".
Se você estiver trabalhando em C, por exemplo, que não tenha OO incorporado, poderá achar conveniente armazenar ponteiros para funções dentro de objetos de dados. Se o fizer, estará entrando no OOP.
Não gosto de me referir a Alan Kay como se ele fosse Moisés entregando as tábuas. Pelo contrário, ele foi treinado em matemática e bio, acredito. Como um cara de matemática, ele provavelmente tinha alguma familiaridade com o Lambda Calculus, que era bastante abstrato, não relacionado ao hardware. Na LC, você pode dizer que tudo é um "objeto" - como o número 0 e o número 1 são objetos que avaliam coisas diferentes quando recebem um argumento. Isso leva ao Smalltalk muito bem. A idéia de "mensagem" é para que possamos evitar falar sobre hardware. Pode-se dizer que, quando você chama uma função (ou o método de um objeto), está enviando uma mensagem e, quando ela retorna, está enviando uma mensagem para você (ou para sua continuação). Isso foi abordado como uma maneira de descrever maneiras de se comunicar entre programas executados de forma assíncrona em hardware separado. Isso é bom, mas para a programação comum está se deixando levar. Para obter o valor da ideia de POO, não é necessário negar a relevância da tarefa concreta que você está tentando executar ou negar a concretude do hardware em que está executando. Eu acho que ensinar sobre OOP em termos de analogias inventadas leva as pessoas a pensar muito em design de software em termos de estrutura de dados, levando ao seu excesso de design, levando a inchaço do código e a problemas de desempenho maciços, que eu tenho que gastar tempo limpando quando fica ruim o suficiente.