API: merge will cast keys to min dtype, rather than upcast for mixed (integer) dtypes
xref https://github.com/pandas-dev/pandas/commit/e8d9e79fc7d0a31e8c37c82f1e48d51cce59e9e0

```
In [1]: left = pd.DataFrame({'num': np.int32([1, 2, 1, 2, 1])}); right = pd.DataFrame({'num': np.int64([1, 2, 3]), 'value': list('abc')})

In [4]: pd.merge(left, right, on='num', how='left').dtypes
Out[4]: 
num       int32
value    object
dtype: object

In [5]: pd.merge(left, right, on='num', how='inner').dtypes
Out[5]: 
num       int32
value    object
dtype: object

In [6]: pd.merge(left, right, on='num', how='outer').dtypes
Out[6]: 
num       int64
value    object
dtype: object

In [7]: pd.merge(left, right, on='num', how='right').dtypes
Out[7]: 
num       int64
value    object
dtype: object
```

I guess this is a bit inconsistent as with mixed types we should use the common one. This is an explicit decision though, we are *choosing* to cast to the left/right as appropriate (it is a safe cast though).