BasicDecimal128 uses two dedicated int64 (higher, lower) to store the value. It's possible to use std::array<uint64, 2> to store the value, just like BasicDecimal256 does, and to unify the two classes.
As decimal operations are quite expensive, guess this indirection won't cause performance loss.
Related issues:
Note: This issue was originally created as ARROW-13439. Please see the migration documentation for further details.