As a side point....

Very few models out there deliberately have non-orthogonal TBN-vector sets, very few. Additionally, using a skew matrix for modelview is not really that common either....

Also as a side note, using quaternions for stuff besides TBN does happen, quite a bit at time. Indeed, if one knows apriori that the transformations one has are always orthoginal, then a (vec3, float, quaternion) tuple handles translation, scaling, mirroring and rotation.. i.e. an translation + M where M is orthogonal. The main benefit of such in C/C++ code is that composition can be so that the quaternion multiplies normalized the result.. this keeps thing much more numerically stable and is faster than reorthogonalizing a matrix.

at any rate making quaternion a built in type in GLSL is useful.