Заколхозил что-то вот такое:
https://jsfiddle.net/9cvuL7zc/Если в двух словах: используя CSS square technique выравниваем высоту элемента по его ширине, затем позиционируем .inner в центре получившегося квадрата.
.ghost-inner нужен потому как обычный .inner имеет абсолютное позиционирование, а значит родительский блок не будет по нему выравниваться.
Из минусов: приходится дублировать текст и есть завязка на CSS transforms.