diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/convension.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/convension.kt
index 35d312eda..cf8174059 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/convension.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/convension.kt
@@ -98,7 +98,7 @@ internal fun MessageChain.toRichTextElems(forGroup: Boolean, withGeneralFlags: B
         }
 
         when (it) {
-            is PlainText -> elements.add(ImMsgBody.Elem(text = ImMsgBody.Text(str = it.stringValue)))
+            is PlainText -> elements.add(ImMsgBody.Elem(text = ImMsgBody.Text(str = it.content)))
             is CustomMessage -> {
                 @Suppress("UNCHECKED_CAST")
                 elements.add(
@@ -250,7 +250,7 @@ private fun MessageChain.cleanupRubbishMessageElements(): MessageChain {
             }
             if (last is VipFace && element is PlainText) {
                 val l = last as VipFace
-                if (element.length == 4 + (l.count / 10) + l.kind.name.length) {
+                if (element.content.length == 4 + (l.count / 10) + l.kind.name.length) {
                     last = element
                     return@forEach
                 }
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/utils/type.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/utils/type.kt
index f1ce23a47..1385beb35 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/utils/type.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/utils/type.kt
@@ -52,7 +52,7 @@ internal fun SingleMessage.estimateLength(upTo: Int): Int {
     return when (this) {
         is QuoteReply -> 444 + this.source.originalMessage.estimateLength(upTo) // Magic number
         is Image -> 260 // Magic number
-        is PlainText -> stringValue.chineseLength(upTo)
+        is PlainText -> content.chineseLength(upTo)
         is At -> display.chineseLength(upTo)
         is AtAll -> display.chineseLength(upTo)
         else -> this.toString().chineseLength(upTo)
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/At.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/At.kt
index a206d6a4f..0b8259c67 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/At.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/At.kt
@@ -32,9 +32,7 @@ import kotlin.jvm.JvmSynthetic
 data class At
 @Suppress("DataClassPrivateConstructor")
 private constructor(val target: Long, val display: String) :
-    MessageContent,
-    CharSequence by display,
-    Comparable<String> by display {
+    MessageContent {
 
     /**
      * 构造一个 [At] 实例. 这是唯一的公开的构造方式.
@@ -63,7 +61,7 @@ private constructor(val target: Long, val display: String) :
 
     // 自动为消息补充 " "
     override fun followedBy(tail: Message): MessageChain {
-        if (tail is PlainText && tail.stringValue.startsWith(' ')) {
+        if (tail is PlainText && tail.content.startsWith(' ')) {
             return super.followedBy(tail)
         }
         return super.followedBy(PlainText(" ")) + tail
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/AtAll.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/AtAll.kt
index 6a127cc42..745a8394f 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/AtAll.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/AtAll.kt
@@ -27,9 +27,7 @@ private const val displayA = "@全体成员"
  */
 object AtAll :
     Message.Key<AtAll>,
-    MessageContent,
-    CharSequence by displayA,
-    Comparable<String> by displayA {
+    MessageContent {
 
     @SinceMirai("0.31.2")
     const val display = displayA
@@ -49,7 +47,7 @@ object AtAll :
 
     // 自动为消息补充 " "
     override fun followedBy(tail: Message): MessageChain {
-        if (tail is PlainText && tail.stringValue.startsWith(' ')) {
+        if (tail is PlainText && tail.content.startsWith(' ')) {
             return super.followedBy(tail)
         }
         return super.followedBy(PlainText(" ")) + tail
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Face.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Face.kt
index a43e02866..cc8bd62d9 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Face.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Face.kt
@@ -21,8 +21,7 @@ import kotlin.jvm.JvmName
 data class Face
 @Suppress("DataClassPrivateConstructor")
 private constructor(val id: Int, private val stringValue: String) : // used in delegation
-    MessageContent,
-    CharSequence by stringValue, Comparable<String> by stringValue {
+    MessageContent {
     constructor(id: Int) : this(id, "[mirai:face:$id]")
 
     override fun toString(): String = stringValue
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Message.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Message.kt
index ca6059eec..b33d48118 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Message.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Message.kt
@@ -279,7 +279,7 @@ interface Message { // must be interface. Don't consider any changes.
 @SinceMirai("0.39.3")
 fun Message.isContentEmpty(): Boolean = when (this) {
     is MessageMetadata -> true
-    is PlainText -> this.stringValue.isEmpty()
+    is PlainText -> this.content.isEmpty()
     is MessageChain -> this.all { it.isContentEmpty() }
     else -> false
 }
@@ -339,6 +339,25 @@ interface SingleMessage : Message {
         DeprecationLevel.ERROR
     )
     /* final */ override infix fun eq(other: String): Boolean = this.contentToString() == other
+
+
+    @PlannedRemoval("1.1.0")
+    @JvmSynthetic
+    @SinceMirai("1.0.0")
+    @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
+    fun length(): Int = this.toString().length
+
+    @PlannedRemoval("1.1.0")
+    @JvmSynthetic
+    @SinceMirai("1.0.0")
+    @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
+    fun charAt(index: Int): Char = this.toString()[index]
+
+    @PlannedRemoval("1.1.0")
+    @JvmSynthetic
+    @SinceMirai("1.0.0")
+    @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
+    fun subSequence(start: Int, end: Int): CharSequence = this.toString().subSequence(start, end)
 }
 
 /**
diff --git a/mirai-core/src/commonTest/kotlin/net/mamoe/mirai/message.data/ConstrainSingleTest.kt b/mirai-core/src/commonTest/kotlin/net/mamoe/mirai/message.data/ConstrainSingleTest.kt
index ec18faf00..2e2d8498d 100644
--- a/mirai-core/src/commonTest/kotlin/net/mamoe/mirai/message.data/ConstrainSingleTest.kt
+++ b/mirai-core/src/commonTest/kotlin/net/mamoe/mirai/message.data/ConstrainSingleTest.kt
@@ -32,20 +32,6 @@ internal class TestConstrainSingleMessage : ConstrainSingle<TestConstrainSingleM
 
     override val key: Message.Key<TestConstrainSingleMessage>
         get() = Key
-    override val length: Int
-        get() = TODO("Not yet implemented")
-
-    override fun get(index: Int): Char {
-        TODO("Not yet implemented")
-    }
-
-    override fun subSequence(startIndex: Int, endIndex: Int): CharSequence {
-        TODO("Not yet implemented")
-    }
-
-    override fun compareTo(other: String): Int {
-        TODO("Not yet implemented")
-    }
 }
 
 @OptIn(MiraiExperimentalAPI::class)